将int数组转换为对象数组

cou*_*que 6 c#-4.0

为什么这是合法的,

string[] arr = new string[5];
Object[] arr2 = arr;
Run Code Online (Sandbox Code Playgroud)

但这是编译时错误,

int[] arr = new int[5];
Object[] arr2 = arr;
Run Code Online (Sandbox Code Playgroud)

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

Ree*_*sey 5

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

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

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