gpt4 book ai didi

C# - 编译器错误 - 将 int[] 分配给 object[]

转载 作者:太空狗 更新时间:2023-10-29 20:11:22 26 4
gpt4 key购买 nike

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
object[] obj = new object[3];
obj[0] = new object();
obj[1] = "some string";
obj[2] = 10;

string[] strings = new string[] { "one", "two", "three" };
obj = strings; //---> No Error here, Why ?

int[] ints = new int[] { 1, 2, 3 };
obj = ints; /*-> Compiler error - Cannot implicitly convert type 'int[]' to 'object[]', Why ?*/
}
}
}

我在执行上述步骤时遇到编译器错误。但是,在前面的步骤中,没有错误。有人可以向我解释这种行为吗?我正在使用 VS 2010。

EDIT - For sake of completeness, again, this won't compile - Variance support in .NET 4.0 has been cleaned up now. One can use new keywords in and out with generic type parameters.

    List<object> objectList = new List<object>();
List<string> stringList = new List<string>();
objectList = stringList;

最佳答案

只有引用类型的数组(如 String)可以分配给其他引用类型的数组(如 Object)。由于 int 是值类型,它的数组不能赋值给其他类型的数组。

更具体地说,这叫做array covariance .它仅在存储在数组中的位模式与目标类型兼容时才有效。例如,String[] 中的位都是对字符串的引用,可以安全地复制到存储对象引用的内存位置。然而,值类型数组存储元素的实际数据(而不是仅仅对它们的引用)。这意味着 int[] 将实际的 32 位整数存储在数组的元素中。由于无法将 32 位整数安全地复制到存储对对象或任何其他类型的引用的内存位置,因此您不能将它们的数组分配给任何其他类型的数组。

请注意,从技术上讲,int 的位可以安全地复制到存储 uint 的内存位置(反之亦然)。这意味着您应该能够执行类似 int[] x = new uint[10] 的操作。这实际上不是协变性,C# 不允许这样做。但是,它在 CLR 中是合法的,如果您愿意,您可以说服 C# 让您这样做。

关于C# - 编译器错误 - 将 int[] 分配给 object[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7300780/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com