为什么我不能使用与数组声明分开的数组初始化语法?
我可以用整数做到这一点:
int a; a = 5;
但我不能用整数数组做到这一点:
int[] a; a = { 1, 2, 3, 4, 5 };
为什么不?
为了澄清,我不是在寻找正确的语法。 我可以抬头看。 我知道这有效:
int[] a = { 1, 2, 3, 4, 5 };
这相当于:
int a = 5;
我想要了解的是,为什么代码失败的数组? 代码未能被识别为有效的原因是什么。
之所以存在差异,原因是微软公司决定在同一语句中声明和初始化数组时减轻语法,但没有添加必要的语法以允许您稍后为其分配新数组。
这就是为什么这有效:
int[] a = { 1, 2, 3, 4, 5 };
但这不是:
int[] a; a = { 1, 2, 3, 4, 5 };
他们可以添加语法来允许这个吗? 当然,但他们没有。 他们很可能认为这个用例很少使用,因此不保证优先于其他function。 所有新function都以负100分开始,这可能只是在优先级列表上排名不够高。
请注意, { 1, 2, 3, 4, 5 }
本身没有任何意义,它只能出现在两个地方:
-
作为数组变量声明的一部分:
int[] a = { 1, 2, 3, 4, 5 };
-
作为数组创建表达式的一部分:
new int[] { 1, 2, 3, 4, 5 }
另一方面,数字5
在C#中出现的含义无处不在,这就是为什么这样做的原因:
int a; a = 5;
所以这只是C#的设计者决定支持的特殊语法,仅此而已。
C#规范,第12.6节“ arrays初始化器”一节中介绍了此语法。
数组示例不起作用的原因是因为值和引用类型之间的差异。 int
是值类型。 它是内存中的单个位置,其值可以更改。
整数数组是引用类型。 它不等于内存中的常量字节数。 因此,它是指向存储该数据的字节的指针。
在第一行中,您将为null
分配null
。
int[] a;
在下一行中,如果要更改数组的值,则需要将其分配给新数组。
a = new[] {1, 2, 3, 4, 5};
这就是为什么如果强烈键入声明,则需要在数组中的值列表之前使用new[]
。
int[] a = {1, 2, 3, 4, 5}; // This will work. var a = {1, 2, 3, 4, 5}; // This will not.
但是,正如许多其他答案所说,如果你在一行中声明它,那么你不需要new[]
。 如果将声明和初始化分开,则需要使用new[]
。
这是初始化int数组的语法:
var a = new int[] { 1, 2, 3, 4, 5 };
int[]
是冗余的,因为类型可以由数组中的给定值确定。 所以你可以写:
var a = new[] { 1, 2, 3, 4, 5 };
要初始化数组,您应该尝试这样:
int[] a = { 1, 2, 3, 4, 5 };
初始化一维数组的其他方法:
int[] a = new int[] { 1, 2, 3, 4, 5 }; int[] a = new int[5] { 1, 2, 3, 4, 5 };
看看这个: 初始化不同类型的数组的不同方法
{}
语法可用于数组初始化,不能在声明后使用。
应该在第一次设置数组的类型和长度:
int[] array = new int[5] { 1 , 2 , 3 , 4 , 5}
如果您想稍后添加元素,可以使用列表:
var myList = new List(); myList.Add(1); myList.AddRange(new [] {2 , 3 , 4 , 5})
您可以将列表的结果作为数组:
var result = myList.ToArray(); //result is an array of {1,2,3,4,5} values.
var a = new int[] { 1, 2, 3, 4, 5 };
– 初始化带有类型指示的数组。
var a = new[] { 1, 2, 3, 4, 5 };
或var a = { 1, 2, 3, 4, 5 };
– 没有类型指示的数组初始化; type是由数组元素的类型找到的。