我有三个共同父母的课程。 让我们说父母是动物,孩子是狗,猫和鹦鹉。

我有一个可观察的集合,其中包含用户正在使用的动物集合。 收集包含所有相同类型的动物 - 用户只能与所有狗或所有猫或所有鹦鹉一起工作。

所以我声明了ObservableCollection<Animal>动物,并根据用户选择我想将属性动物的内容更改为ObservableCollection<Dog>ObservableCollection<Cat>ObservableCollection<PArrot> 因此,如果用户目前与狗或猫一起工作并不重要,但他可以选择动物共有的所有动作。

但它不起作用。 似乎我不能将ObservableCollection<Cat>分配给ObservableCollection<animal>类型的Property。 我认为它应该有用,因为动物是猫的超类型,所以我可以像往常一样将猫分配给动物变量。

为什么我不能这样做,我该如何解决这个问题呢?

===============>>#1 票数:5 已采纳

它不起作用的一个原因:如果它确实有效,你可能会有无意义的情况:

ObservableCollection<Animal> animals = new ObservableCollection<Dog>();
animals.Add(new Cat()); // cat is an animal, after all

另一个原因是,它根本就不是的情况下ObservableCollection<Dog> 继承 ObservableCollection<Animal> -它们只是不同(并行)关闭一般类型ObservableCollection<>

什么允许的是,一些接口与“出只有” API(如IEnumerable<T>可以是协变的,所以如果你需要的是迭代它们,你可以有:

IEnumerable<Animal> animals = new ObservableCollection<Dog>();

(大概是狗放在其他地方)

另一种方法是使用非通用API:

IList animals = new ObservableCollection<Dog>();

===============>>#2 票数:1

您不必使用ObservableCollection ,而是必须将这些集合键入IEnumerable<T> ,因为ObservableCollection不支持类型协方差。 没有允许您添加元素的集合将支持这种类型的继承。 要了解原因,请考虑这个假设代码( 编译)

List<object> myObjects = new List<string>();

你认为这样可以,但是看看如果你写下面的内容会发生什么:

myObjects.Add(new Dog());

myObjects被声明为一个对象列表,因此上面的代码将被编译,但是在运行时事情会爆发,因为在myObjectsmyObjects被实例化为只保存字符串。

===============>>#3 票数:0

使其成为一个界面,并使用协方差

interface ObservableCollection <out T>
{

}

===============>>#4 票数:0

如果你不需要,不要用协方差使它过于复杂。 您应该创建ObservableCollection<Animal> ,无论您是否使用Cats,Dogs或Parrots填充它,因为您不使用任何子类功能。

您没有提到为什么使用ObervableCollection,但是如果您没有观察它并且不关心如何通知列表的更改,您也可以转换它。

  ask by translate from so

未解决问题?本站智能推荐: