代码之家  ›  专栏  ›  技术社区  ›  Matt B

为什么C#数组是协变的?它带来了什么好处?

  •  8
  • Matt B  · 技术社区  · 14 年前

    object[] myArray = new string[1];
    myArray[0] = 1;
    

    这段代码可以正常编译,但在运行时会毫不犹豫地爆发。

    3 回复  |  直到 12 年前
        1
  •  13
  •   mqp    14 年前
        2
  •  4
  •   CaffGeek    14 年前
        3
  •  1
  •   supercat    11 年前

    Arr 是一个至少包含两个元素的一维数组,下面的代码将在不考虑元素类型的情况下工作

    Object temp = Arr[1];
    Arr[1] = Arr[0];
    Arr[0] = temp;
    

    如果 阿里尔 是值类型,但因为 temp 如果从数组中读取,则保证数组的类型能够保存这样的值。代码必须对值类型元素进行box和unbox操作,因此对于此类类型效率很低,但无论如何都可以工作。

    请注意,虽然使数组协变是允许排序方法等方法处理任意数组类型的一种方法,但这并不是唯一的方法。另一种方法是 System.Array 包括一些参数与基础元素类型无关的方法和属性。例如,它可以包括一些简单的方法,比如 Swap , CopyItem Roll ,以及在给定索引列表的情况下执行更复杂排列的方法。请注意,与上面显示的代码不同,类型 Int[] 可以覆盖它的 互换