.net为什么无法从int []转换为object []

时间:2012-07-27 03:27:41

标签: .net object boxing

我有以下方法

private void AM(object[] x)
{
}

当我们这样称呼时:

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

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

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

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

3 个答案:

答案 0 :(得分:8)

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

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

由于object[]是一种值类型,因此没有简单的方法可以将对int的引用转换为int[]的引用而不迭代整个object[]并且每个元件。在时间和内存方面,这可能是一项昂贵的操作,编译器不会自动为你做这件事。

答案 1 :(得分:4)

只能将引用类型数组分配给其他引用类型的数组(如Object)。由于int是值类型,因此无法执行此操作。

这称为Array Covariance

  

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

答案 2 :(得分:2)

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