我有以下方法
private void AM(object[] x)
{
}
当我们这样称呼它时:
int[] x = new int[1];
AM(x);
我们得到一个编译错误,例如“无效参数”、“无法从 int[] 转换为 object[]”。
但是,如果我们有一个参数(对象 y),我们可以将输入 int 作为输入参数。
我的问题是:为什么微软以不同的方式设计它们?
当您将int
(值类型)传递给带有object
(引用类型)参数的方法时,会在堆上创建一个新对象,并将其值int
复制到其中。然后将对象的引用(被装箱的int
)传递给方法参数。
int[]
并且object[]
都是数组,但它们的元素类型非常不同。作为数组,它们都是引用类型,因此采用object[]
参数的方法期望引用对象数组。对整数数组的引用是非常不同的。
因为int
它是一种值类型,所以没有简单的方法可以将引用int[]
转换为引用object[]
而不迭代整个int[]
元素并对每个元素进行装箱。就时间和内存而言,这可能是一项昂贵的操作,编译器不会自动为您完成。
只有引用类型的数组可以分配给其他引用类型(如对象)的数组。由于 int 是一种值类型,因此您不能这样做。
这称为数组协方差
数组协方差特别不扩展到值类型的数组。例如,不存在允许将 int[] 视为 object[] 的转换。
与 int 数组相比,对象数组是一种完全不同的动物(正如您所得到的转换错误所见)。但是,object[] 和 int[] 都是对象,因此您可以将它们都转换为它们的原始类型(如原始类型),即对象。