【发布时间】:2013-05-09 08:00:08
【问题描述】:
C# 中的数组在引用类型上是隐式协变的:
object[] listString = new string[] { "string1", "string2" };
但不是值类型,所以如果你把string改成int,你会得到编译错误:
object[] listInt = new int[] {0, 1}; // compile error
现在,问题是当你像下面两种语法声明int数组时,它们没有显式声明类型int,只是区分new[],编译器会区别对待:
object[] list1 = { 0, 1 }; //compile successfully
object[] list2 = new[] {0, 1}; //compile error
你会得到object[] list1 = { 0, 1 };编译成功,但是object[] list2= new[] {0, 1};编译错误。
似乎 C# 编译器会处理
object[] list1 = { 0, 1 };
作为
object[] list1 = new object[]{ 0, 1 };
但是
object[] list2 = new[] { 0, 1 };
作为
object[] list2 = new int[]{ 0, 1 }; //error because of co-variant
为什么 C# 编译器在这种情况下会有不同的行为方式?
【问题讨论】:
-
+1,你来自this question
-
@Habib:是的,灵感来自它
-
快速猜测,所有引用类型都采用相同的字节数作为引用,因此很容易隐式转换。
-
老实说,我以前从未见过
new[] { ... }语法。你确定这在 C# 规范中是正确的吗? -
@ja72:它叫做implicitly typed array。你可以在VS中试试这个