为什么数组不是逆变的?

时间:2013-10-13 13:45:12

标签: c# .net .net-4.0 covariance

我在想:

从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[])...

1 个答案:

答案 0 :(得分:3)

它们允许协方差是很糟糕的,因为每次你写入一个数组,即将其中一个元素设置为新的引用时,就必须进行类型检查。

如果它们也允许相反,那么阵列的每个读取也需要进行类型检查。那会更糟。

在.NET的旧时代,通常会传递数组,接收器只能从数组中读取。那个“疯狂”的协方差有点意义。逆变法没那么有用。