转换类型绑定列表

时间:2014-07-24 19:26:54

标签: c# oop

我有BindingList<BaseClass>变量。然后我想将它分配给BindingList但是得到无法转换的错误......是否可能?

BindingList<BaseClass> base;
...
BindingList<ChildClass> child = new BindingList<ChildClass>();
...
base = child;

最后一行给出了无法将一种类型转换为另一种类型的错误。我理解列表最终是不同的类型,但是,从我的角度来看,列表类型可以由于继承而被转换。

3 个答案:

答案 0 :(得分:3)

  

从我的角度来看,列表类型可以由于继承而被转换

不,他们不能 - 举个例子:

List<Fruit> base;

List<Apple> apples = new List<Apple>();

base = apples;   

// if that were legal, then this could happen:

base.Add(new Orange());  // fail because a list of apples can't store an orange.

您可以将项目转换为新列表:

base = child.Cast<BaseClass>().ToList();

现在base单独的列表,可以包含BaseClass的任何实例。

答案 1 :(得分:0)

你在这里看到的是.Net中的泛型缺乏差异。它是设计的。

基本上,这是为了阻止您执行以下操作:

List<Giraff> giraffs = new List<Giraff>();
List<Animal> animals = giraffs;

...然后代码中的某个地方

animals.Add(new Horse()); //run-time error

基本上,检查会阻止您在运行时执行此操作,并在编译时阻止此操作。有趣的是,阵列不是这样。但那是另一个故事......

以下是关于它的MSDN article

答案 2 :(得分:0)

如果您有BindingList<BaseClass>,则可以在列表中添加ChildClassAnotherChildClass类型的项目。这对BindingList<ChildClass>无效,因此您无法将后者分配给前者。