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。
编辑 - 为了完整性,再次,这不会编译 - .NET 4.0 中的方差支持现已清理。可以使用新的关键词in and out具有泛型类型参数。
List<object> objectList = new List<object>();
List<string> stringList = new List<string>();
objectList = stringList;
仅引用类型的数组(例如String
) 可以分配给其他引用类型的数组(例如Object
)。自从int
是值类型,它的数组不能分配给其他类型的数组。
更具体地说,这称为数组协方差 http://msdn.microsoft.com/en-us/library/aa664572(v=VS.71).aspx。仅当数组中存储的位模式与目标类型兼容时,它才有效。例如,a 中的位String[]
都是对字符串的引用,可以安全地复制到存储对象引用的内存位置。然而,值类型数组存储元素的实际数据(而不只是对它们的引用)。这意味着一个int[]
将实际的 32 位整数存储在数组的元素中。由于无法将 32 位整数安全地复制到存储对对象或任何其他类型的引用的内存位置,因此您不能将它们的数组分配给任何其他类型的数组。
请注意,从技术上讲,int
可以安全地复制到存储的内存位置uint
(反之亦然)。这意味着你应该能够做类似的事情int[] x = new uint[10]
。这实际上并不是协方差,C# 也不允许这样做。但是,它在 CLR 中是合法的,如果您愿意,您可以说服 C# 让您这样做。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)