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