C# 中的数组在引用类型上是隐式协变的:
object[] listString = new string[] { "string1", "string2" };
但不是在值类型上,所以如果你string
改为int
,你会得到编译错误:
object[] listInt = new int[] {0, 1}; // compile error
现在,需要注意的是,当您int
像以下两种语法一样声明数组时,它们没有显式声明 type int
,只是区分 on 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# 编译器在这种情况下的行为方式不同?