为什么这是合法的,
string[] arr = new string[5];
Object[] arr2 = arr;
但这是编译时错误,
int[] arr = new int[5];
Object[] arr2 = arr;
不是int和string都是从Object派生的吗?它是ValueType的东西吗?如果是这样,为什么会这样呢?
答案 0 :(得分:4)
答案 1 :(得分:3)
C#语言仅为引用类型数组提供协方差。记录在案on MSDN:
对于任何两个引用类型A和B,如果从A到B存在隐式引用转换(第6.1.4节)或显式引用转换(第6.2.3节),则数组中也存在相同的引用转换类型A [R]到数组类型B [R],其中R是任何给定的秩指定符(但两种数组类型都相同)。这种关系称为阵列协方差。
在第二个示例中,您使用的是System.Int32
类型的数组,这些类型不是引用类型,因此数组协方差支持不适用。引用类型的核心是存储引用数组,其中引用都是相同的大小。值类型可以是任何大小,因此无法保证数组元素的大小相同,这会阻止它正常工作。