我可以用整数来做到这一点:
int a;
a = 5;
但我不能用整数数组来做这个:
int[] a;
a = { 1, 2, 3, 4, 5 };
为什么不呢?
为了澄清,我不是在寻找正确的语法。我可以抬头看。我知道这有效:
int[] a = { 1, 2, 3, 4, 5 };
这相当于:
int a = 5;
我想要了解的是,为什么数组代码失败?代码未能被识别为有效的原因是什么。
答案 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 };
答案 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.