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

时间:2015-11-29 14:19:40

标签: c# arrays

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

int a;
a = 5;

但我不能用整数数组来做这个:

int[] a;
a = { 1, 2, 3, 4, 5 };

为什么不呢?

为了澄清,我不是在寻找正确的语法。我可以抬头看。我知道这有效:

int[] a = { 1, 2, 3, 4, 5 };

这相当于:

int a = 5;

我想要了解的是,为什么数组代码失败?代码未能被识别为有效的原因是什么。

7 个答案:

答案 0 :(得分:16)

有一个区别的原因是,当在同一语句中声明初始化数组时,Microsoft的人决定减轻语法,但没有添加允许您稍后为其分配新数组所需的语法。

这就是为什么这样做的原因:

int[] a = { 1, 2, 3, 4, 5 };

但这不是:

int[] a;
a = { 1, 2, 3, 4, 5 };

他们可以添加语法来允许这个吗?当然,但他们没有。他们很可能认为这个用例很少被使用,因此它不能保证优先于其他功能。 All new features start with minus 100 points这可能只是在优先级列表中排名不够高。

请注意,{ 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 Array Initializers部分中。

答案 1 :(得分:2)

您的数组示例无法工作的原因是value and reference types之间存在差异。 int是值类型。它是内存中的单个位置,其值可以更改。

您的整数数组是引用类型。它不等于内存中的常量字节数。因此,它是指向存储该数据的字节的指针。

在第一行中,您要将null分配给a

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[]

答案 2 :(得分:1)

这是初始化int数组的语法:

var a = new int[] { 1, 2, 3, 4, 5 };

int[]是多余的,因为类型可以由数组中的给定值确定。所以你可以写:

var a = new[] { 1, 2, 3, 4, 5 };

答案 3 :(得分:1)

要初始化数组,您应该尝试这样:

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 };

看看这个:different ways to initialize different kinds of arrays

答案 4 :(得分:0)

var a = new int[] { 1, 2, 3, 4, 5 };语法可用于数组初始化,不能在声明后使用。

答案 5 :(得分:-1)

var a = new[] { 1, 2, 3, 4, 5 }; - 初始化类型指示的数组。

var a = { 1, 2, 3, 4, 5 };或{{1}} - 没有类型指示的数组初始化; type是由数组元素的类型找到的。

答案 6 :(得分:-1)

阵列的类型和长度应该在第一次设置:

int[] array = new int[5] { 1 , 2 , 3 , 4 , 5}

如果您想稍后添加元素,可以使用列表:

var myList = new List<int>();
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.