为什么我不能使用与数组声明分开的数组初始化语法?

我可以用整数做到这一点:

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是由数组元素的类型找到的。