【问题标题】:Using variance to convert a parent class (ObservableCollection) to a child使用方差将父类(ObservableCollection)转换为子类
【发布时间】:2017-01-30 02:38:21
【问题描述】:

在我尝试这样做之前,我一直以为我知道它是如何工作的;但是,以下代码会引发异常。因为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 分配给我的孩子班级?

【问题讨论】:

  • 为什么要将父类强制转换为子类?
  • 几乎与以下内容重复:stackoverflow.com/questions/16534253/…
  • 您不能将任意的Animal 转换为Dog。您可以创建一个 new Dog,其属性与 Animal 相同,但不能进行转换。

标签: c# observablecollection variance


【解决方案1】:

您不能将 ObservableCollection&lt;MyClass&gt; 转换为 TestOC

因为它是派生的。含义 TestOC 扩展 ObservableCollection&lt;MyClass&gt;。因此,如果您想将ObservableCollection&lt;MyClass&gt; 转换为TestOC,则缺少TestOC 添加的功能。 (即使子类没有任何额外的东西)

但是您可以将TestOC 转换为ObservableCollection&lt;MyClass&gt;。因为TestOC 确实实现了ObservableCollection&lt;MyClass&gt; 实现的所有功能。


这不起作用

TestOC test2 = new ObservableCollection<MyClass>();

这确实有效

ObservableCollection<MyClass> test2 = new TestOC();

如何让 ObservableCollection 分配给我的子类?

你不能,但有一些选择:

1 - 你应该构造一个TestOC,而不是创建一个ObservableCollection&lt;MyClass&gt;(新 TestOC())

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 2022-11-18
    • 1970-01-01
    相关资源
    最近更新 更多