我在想:
从C#4.0开始,通用接口允许协方差(和泛型委托4一样),但泛型类不允许。
数组支持协方差(S []可以转换为B []如果S子类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[])...
答案 0 :(得分:3)
它们允许协方差是很糟糕的,因为每次你写入一个数组,即将其中一个元素设置为新的引用时,就必须进行类型检查。
如果它们也允许相反,那么阵列的每个读取也需要进行类型检查。那会更糟。
在.NET的旧时代,通常会传递数组,接收器只能从数组中读取。那个“疯狂”的协方差有点意义。逆变法没那么有用。