创建数组对象,初始化数组元素。
C# 允许用一个语句做这两件事情:
大括号中的以逗号分隔的数据项称为数组初始化器(array initializer)。每个数据项都可以是一个任意复杂度的表达式;
在多维数组的情况下,则可以是一个嵌套的数组初始化器。
可以利用 C# 的 隐式类型的局部变量功能:
可利用 C# 的隐式类型的数组功能让编译器推断数组元素的类型:
上一行代码中,编译器检查数组中用于初始化数组元素的表达式的类型,并选择所有元素最接近的公共基类来作为数组的类型。在本例中,编译器发现两个string和要给null。由于null可隐式转型为任意引用类型,所以编译器推断应该创建和初始化一个由string引用构成的数组。
如果写一下代码:
就会报错。这是由于两个string和一个int的公共基类是Object,意味着编译器不得不创建Object引用的一个数组,然后对 123 进行装箱,并让最后一个数组元素引用已装箱的、值为 123 的一个 int。C# 团队认为,隐式对数组元素进行装箱是一个代价高昂的操作,所以要在编译时报错。
作为初始化数组时的一个额外的语法奖励,还可以想下面这样写:
赋值操作符(=)右侧只给出了一个初始化器,没有 new ,没有类型,没有 [] 。这个语法可读性很好。
不可以像下面这样:
虽然理论上可以通过编译,但 C# 团队认为编译器在这里会为你做太多的工作。它要推断数组类型,新建数组对象,初始化数组,还要推断局部变量的类型。
“隐式类型的数组”如何与“匿名类型”和“隐式类型的局部变量”组合使用。