为什么数组不是逆变的

本文关键字:数组 为什么 | 更新日期: 2023-09-27 18:35:13

我想知道:

从 C# 4.0 开始,泛型接口允许协方差(泛型委托4 也是如此),但泛型类不允许。

数组支持协方差(如果 S 子类 B 可以强制转换为 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[])...

为什么数组不是逆变的

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

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

在过去,.NET 数组经常被传递,接收方只从数组中读取。"疯狂"的协方差在当时有点道理。逆变没有那么有用。