这些是简单数组的当前声明和初始化方法。
string[] array = new string[2]; // creates array of length 2, default values
string[] array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
string[] array = new[] { "A", "B" }; // created populated array of length 2
请注意,存在其他获取数组的技术,例如IEnumerable<T>
上ToArray()
扩展。
还要注意,在上面的声明中,前两个可以用var
string[]
,因为右侧的信息足以推断出正确的类型。第三行必须按照显示的方式编写,因为仅数组初始化语法不足以满足编译器的需求。第四个也可以使用推论。因此,如果您全神贯注,上面的内容可以写成
var array = new string[2]; // creates array of length 2, default values
var array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
var array = new[] { "A", "B" }; // created populated array of length 2
C#中作为表达式的数组创建语法为:
new int[3]
new int[3] { 10, 20, 30 }
new int[] { 10, 20, 30 }
new[] { 10, 20, 30 }
在第一个中,大小可以是任何非负整数值,并且数组元素将初始化为默认值。
在第二个中,大小必须为常数,并且给定的元素数必须匹配。从给定元素到给定数组元素类型必须进行隐式转换。
在第三个元素中,元素必须隐式转换为元素类型,并且大小由给定的元素数量确定。
在第四个中,通过计算所有给定的具有类型的元素中的最佳类型(如果存在)来推断数组元素的类型。所有元素都必须隐式转换为该类型。大小由给定的元素数确定。此语法在 C#3.0 中引入。
还有一种语法只能在声明中使用:
int[] x = { 10, 20, 30 };
元素必须隐式转换为元素类型。大小由给定的元素数确定。
没有多合一的指南
我请您参考 C#4.0 规范的第 7.6.10.4 节 “数组创建表达式”。
var data0 = new int[3]
var data1 = new int[3] { 1, 2, 3 }
var data2 = new int[] { 1, 2, 3 }
var data3 = new[] { 1, 2, 3 }
var data4 = { 1, 2, 3 }
是不可编译的。请使用int[] data5 = { 1, 2, 3 }
。
var data6 = new int[0]
var data7 = new int[] { }
var data8 = new [] { }
和int[] data9 = new [] { }
无法编译。
var data10 = { }
无法编译。请改用int[] data11 = { }
。
var
关键字分配的表达式才能作为参数传递。
Foo(new int[2])
Foo(new int[2] { 1, 2 })
Foo(new int[] { 1, 2 })
Foo(new[] { 1, 2 })
Foo({ 1, 2 })
是不可编译的Foo(new int[0])
Foo(new int[] { })
Foo({})
无法编译