我想知道:
从 C# 4.0 开始,泛型接口允许协方差(泛型委托4 也是如此),但泛型类不允许。
数组支持协方差(如果 S 子类 B 可以强制转换为 B[)
所以这样做是完全有效的:
string[] obj = new string[3];
obj[0]="1";
obj[1]="2";
obj[2]="3";
Do something with : (obj as object[])
Do something with : (object[])obj ...
Do something with : ((IEnumerable<object>)obj)
但是这种可重用性的缺点是元素赋值可能会在运行时失败:
(obj as object[])[0] = new DateTime(); //errrr...
好的太好了 - 它可能会失败。
因此,如果它已经在运行时失败(由我来检查),他们为什么不也让它contravariant
?
object[] obj = new object[3];
obj[0]="1";
obj[1]="2";
obj[2]="3";
这样我就能够做(我的责任):
(obj as string[])...
它们允许协方差已经够糟糕的了,因为每次写入数组时,即将其元素之一设置为新引用时,都必须执行类型检查。
如果它们也允许逆变,则数组的每次读取也需要进行类型检查。那会更糟。
在过去,.NET 数组经常被传递,接收方只从数组中读取。"疯狂"的协方差在当时有点道理。逆变没有那么有用。