我在想 :
从 C# 4.0 开始,泛型接口允许协变(泛型委托也是如此),但泛型类不允许。
数组支持协方差(如果 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[])...