3

我有以下方法

private void AM(object[] x)
{
}

当我们这样称呼它时:

int[] x = new int[1];
AM(x);

我们得到一个编译错误,例如“无效参数”、“无法从 int[] 转换为 object[]”。

但是,如果我们有一个参数(对象 y),我们可以将输入 int 作为输入参数。

我的问题是:为什么微软以不同的方式设计它们?

4

3 回答 3

9

当您将int(值类型)传递给带有object(引用类型)参数的方法时,会在堆上创建一个新对象,并将其值int复制到其中。然后将对象的引用(被装箱的int)传递给方法参数。

int[]并且object[]都是数组,但它们的元素类型非常不同。作为数组,它们都是引用类型,因此采用object[]参数的方法期望引用对象数组。对整数数组的引用是非常不同的。

因为int它是一种值类型,所以没有简单的方法可以将引用int[]转换为引用object[]而不迭代整个int[]元素并对每个元素进行装箱。就时间和内存而言,这可能是一项昂贵的操作,编译器不会自动为您完成。

于 2012-07-27T03:34:48.787 回答
4

只有引用类型的数组可以分配给其他引用类型(如对象)的数组。由于 int 是一种值类型,因此您不能这样做。

这称为数组协方差

数组协方差特别不扩展到值类型的数组。例如,不存在允许将 int[] 视为 object[] 的转换。

于 2012-07-27T03:36:11.240 回答
2

与 int 数组相比,对象数组是一种完全不同的动物(正如您所得到的转换错误所见)。但是,object[] 和 int[] 都是对象,因此您可以将它们都转换为它们的原始类型(如原始类型),即对象。

于 2012-07-27T03:33:54.040 回答