1

我在想 :

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

1 回答 1

3

它们允许协方差已经够糟糕了,因为每次你写入一个数组时,即将它的一个元素设置为一个新的引用,都必须执行类型检查。

如果它们也允许逆变,那么每次读取数组都需要进行类型检查。那会更糟。

在过去的 .NET 数组中,通常会在预期接收器仅从数组中读取的地方通过。“疯狂”的协方差在那时有点道理。逆变没有那么有用。

于 2013-10-13T14:03:28.563 回答