【发布时间】:2013-02-02 18:31:53
【问题描述】:
对我来说这样做是完美的:
public class A { }
public class B : A { }
public class C
{
public List<A> b = new List<B>();
}
List 期望元素属于 A 类,对于 List 也是如此。我知道存在类型不匹配,但从逻辑上讲,编译器允许这种不匹配是完全合理的。为什么不呢?
【问题讨论】:
-
通常的polymorphism 表示当
B派生自A时,可以说A b = new B();。但请注意,List<B>not 派生自List<A>,因此我们不能使用它。因此,您需要的是协方差。但是由于List<>既可以读取又可以写入(输出和输入),因此它不可能是协变的。想想这个简单的例子:List<Bear> list1 = new List<Bear>(); List<Animal> list2 = list1 /* would be OK if List<> were covariant */ ; list2.Add(new Zebra());Add调用必须失败,否则熊列表中会包含斑马。 -
尽管我刚才说过,数组确实有这种“疯狂”的协方差。因此你可以说
A[] bArray = new B[100];。之后bArray[0] = new A();可以正常编译,但会破坏运行时(异常)。
标签: c# templates inheritance