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