将int数组转换为对象数组

时间:2013-07-09 16:10:54

标签: c#-4.0

为什么这是合法的,

string[] arr = new string[5];
Object[] arr2 = arr;

但这是编译时错误,

int[] arr = new int[5];
Object[] arr2 = arr;

不是int和string都是从Object派生的吗?它是ValueType的东西吗?如果是这样,为什么会这样呢?

2 个答案:

答案 0 :(得分:4)

这称为unsafe array covariance

它仅适用于引用类型的数组。

值类型的数组是物理上不同的大小,所以这不起作用。

答案 1 :(得分:3)

C#语言仅为引用类型数组提供协方差。记录在案on MSDN

  

对于任何两个引用类型A和B,如果从A到B存在隐式引用转换(第6.1.4节)或显式引用转换(第6.2.3节),则数组中也存在相同的引用转换类型A [R]到数组类型B [R],其中R是任何给定的秩指定符(但两种数组类型都相同)。这种关系称为阵列协方差。

在第二个示例中,您使用的是System.Int32类型的数组,这些类型不是引用类型,因此数组协方差支持不适用。引用类型的核心是存储引用数组,其中引用都是相同的大小。值类型可以是任何大小,因此无法保证数组元素的大小相同,这会阻止它正常工作。