使用方差将 parent class (ObservableCollection) 转换为 child

Using variance to convert a parent class (ObservableCollection) to a child

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

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;
    }
}

抛出的错误是:

Unable to cast object of type 'System.Collections.ObjectModel.ObservableCollection`1[ConsoleApplication17.MyClass]' to type 'ConsoleApplication17.TestOC'.

如何让 ObservableCollection 在这里分配给我的 child class?

您不能将 ObservableCollection<MyClass> 转换为 TestOC

因为是派生的。意思是 TestOC 扩展 ObservableCollection<MyClass>。因此,如果您想将 ObservableCollection<MyClass> 转换为 TestOC,它会缺少 TestOC 添加的功能。 (即使子类没有任何额外的东西)

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


这不行:

TestOC test2 = new ObservableCollection<MyClass>();

这确实有效:

ObservableCollection<MyClass> test2 = new TestOC();

How can I get the ObservableCollection to assign to my child class here?

你不能,但有一些选择:

1 - 与其创建 ObservableCollection<MyClass>,不如构建 TestOC(new TestOC())

2 - 如果您不想写 ObservableCollection<MyClass> 而是更短的版本,您可以使用 aliases,但这不会添加任何功能。这只是语法糖。这样你就可以 new 一个 TestOC 但在它后面是一个 ObservableCollection<MyClass> 所以完全可以分配。

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