C#数组协方差

对于任意两个“引用类型”A和B,若是存在从A到B的隐式引用转换或显式引用转换,则也必定存在从数组类型A[R]到数组类型B[R]的相同的引用转换,其中R能够是任何给定的“秩说明符”,可是这两个数组类型必须使用相同的R,这种关系称为数组协方差。具体来讲,数组协方差就是数组类型A[R]的值实际上多是对数组类型B[R]的实例的引用(若是存在从B到A的隐式引用转换的话)。数组

因为存在数组协方差,对引用类型数组的元素的赋值操做会包括一个运行时检查,以确保正在赋给数组元素的值确实是容许的类型。对象

例如:
 
class Test
{
   static void Fill(object[] array, int index, int count, object value) {
      for (int i = index; i < index + count; i++) array[i] = value;
   }
   static void Main() {
      string[] strings = new string[100];
      Fill(strings, 0, 100, "Undefined");
      Fill(strings, 0, 10, null);
      Fill(strings, 90, 10, 0);
   }
}string

Fill方法中对array[i]的赋值隐式地包括一个运行时检查,它确保由value引用的对象是null或者是与array的实际元素类型兼容的类型的实例。在Main中,Fill的前两个调用成功了,可是在第三个调用中,当执行对array[i]的第一次赋值时会引起System.ArrayTypeMismatchException。发生此异常是由于装箱的int类型不能存储于string数组中。io

具体来讲,数组协方差不能延伸到“值类型”的数组。例如,不存在容许将int[]看成object[]来处理的转换。class

相关文章
相关标签/搜索