【发布时间】:2016-07-25 13:33:42
【问题描述】:
Joseph Albahari 和 Ben Albahari (O'Reilly) 的 C# 6.0 简述。
版权所有 2016 Joseph Albahari 和 Ben Albahari,978-1-491-92706-9。
在第 123-124 页陈述了关于类型协方差:
数组,由于历史原因,数组类型支持协方差。这 意味着如果 B 是 A 的子类(并且两者都是 引用类型)。
例如:
Bear[] bears = new Bear[3];
Animal[] animals = bears; // OK
这种可重用性的缺点是元素分配可能会失败 在运行时:
animals[0] = new Camel(); // Runtime error
这种错误背后的原因是什么? 如果将 Bear 实例分配给 Animal 实例,会抛出运行时错误?我不明白为什么应该这样做(通过允许这样的分配,编译器需要负责说明“好吧,我会让你用这个对象做动物可以做的一切。”由于熊是动物,这会导致没有任何问题。
我创建了自己的场景来测试上述内容:
public class X
{
public int Num { get; set; }
public void Method_1()
{
Console.WriteLine("X");
}
public virtual void Method_2()
{
Console.WriteLine(Num);
}
}
public class Y : X
{
public Y()
{
Num = 1000;
}
}
X[] arrayX = new X[] { new X { Num = 1000 }, new X { Num = 999 }, new X { Num = 51762 } };
Y[] arrayY = new Y[] { new Y { Num = 5 }, new Y { Num = 6 }, new Y { Num = 7 } };
X x = new X { Num = 1000 };
Y y = new Y { Num = 50 };
x = y;
arrayX = arrayY;
arrayX[2] = new Y { Num = 1 };
// will print 5,6,1 - no runtime errors faced
foreach (var e in arrayX)
Console.WriteLine(e.Num);
我相信上面的 sn-p 模仿了书中的例子 - 但我的 sn-p 没有运行时错误。
我错过了什么?正如书中所述,animals[0] = new Camel(); 应该如何引发运行时错误?
【问题讨论】:
-
animals数组看起来像一组动物,但实际上是一组熊。您不能将骆驼添加到一系列熊中(显然熊会吃掉骆驼)。您的示例有动物 (X) 和熊 (Y),但缺少像骆驼这样的第二个子类。
标签: c# covariance