我在想:
在C# 4.0中,泛型接口允许协方差(泛型delegates4也是如此),但是泛型类不允许。
数组支持协方差(如果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[])...发布于 2013-10-13 14:03:28
它们允许协方差已经够糟糕的了,因为每次写入数组时,即将其元素中的一个设置为新引用,就必须执行类型检查。
如果它们也允许反方差,则数组的每次读取也都需要类型检查。那就更糟了。
在过去的.NET中,数组常常被传递给接收方只能从数组中读取。那么“疯狂的”协方差就有点道理了。反方差没有那么有用。
https://stackoverflow.com/questions/19345918
复制相似问题