8

为什么这是合法的,

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

但这是一个编译时错误,

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

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

4

2 回答 2

5

C# 语言只为引用类型的数组提供协方差。这记录在 MSDN 上

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

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

于 2013-07-09T16:13:33.360 回答
4

这称为不安全数组协方差

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

值类型的数组在物理上是不同的大小,所以这是行不通的。

于 2013-07-09T16:13:16.503 回答