繁体   English   中英

使用方差将父类(ObservableCollection)转换为子类

[英]Using variance to convert a parent class (ObservableCollection) to a child

在我尝试这样做之前,我以为我知道它是如何工作的。 但是,以下代码引发异常。 因为TestOCObservableCollection的子级,所以我认为我可以这样做:

class MyClass
{
    public string MyProperty { get; set; }
}

class TestOC : ObservableCollection<MyClass>
{

}

class Program
{
    static void Main(string[] args)
    {
        ObservableCollection<MyClass> test = new ObservableCollection<MyClass>();
        test.Add(new MyClass());

        TestOC test2 = (TestOC)test;
    }
}

引发的错误是:

无法将类型为'System.Collections.ObjectModel.ObservableCollection`1 [ConsoleApplication17.MyClass]'的对象转换为类型为'ConsoleApplication17.TestOC'的对象。

如何在这里获取ObservableCollection分配给我的子班?

您不能将ObservableCollection<MyClass> TestOCTestOC

因为是派生的。 含义TestOC扩展了ObservableCollection<MyClass> 因此,如果要将ObservableCollection<MyClass> TestOCTestOC ,则它将缺少TestOC添加的功能。 (即使子类没有多余的东西)

但是您可以将TestOC转换为ObservableCollection<MyClass> 因为TestOC确实实现了ObservableCollection<MyClass>实现的所有内容。


这不起作用

TestOC test2 = new ObservableCollection<MyClass>();

这确实有效

ObservableCollection<MyClass> test2 = new TestOC();

如何在这里获取ObservableCollection分配给我的子班?

您不能,但是有一些选择:

1-应该构造一个TestOC ,而不是创建ObservableCollection<MyClass> (新的TestOC())

2-如果您不想编写ObservableCollection<MyClass>但要编写一个较短的版本,则可以使用alias ,但这不会添加任何功能。 这只是语法糖。 这样,您可以new一个TestOC,但在其后面是一个ObservableCollection<MyClass>因此可以完全分配。

using TestOC = System.Collections.ObjectModel.ObservableCollection<MyClass>;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM