从锯齿状数组初始化中省略c#new

use*_*334 4 c# jagged-arrays new-operator

来自:http://msdn.microsoft.com/en-us/library/2s05feca.aspx

请注意,您不能从元素初始化中省略new运算符,因为元素没有默认初始化:

int[][] jaggedArray3 = 
{
    new int[] {1,3,5,7,9},
    new int[] {0,2,4,6},
    new int[] {11,22}
};
Run Code Online (Sandbox Code Playgroud)

这是什么意思?

为什么可以省略新的:

int[]    arrSimp = { 1, 2, 3 };
int[,]   arrMult = { { 1, 1 }, { 2, 2 }, { 3, 3 } };
Run Code Online (Sandbox Code Playgroud)

但不可能:

int[][,] arrJagg = {new int[,] { { 1, 1} }, new int[,] { { 2, 2 } }, new int[,] { { 3, 3 } } };
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 9

首先,多么巧合,你问题的一个方面是我今天博客的主题:

http://ericlippert.com/2013/01/24/five-dollar-words-for-programmers-elision/

你在C#分类表达式的方式中发现了一个小的"疣".事实证明,数组初始化器语法{1, 2, 3}不是表达式.相反,它是一个语法单元,只能用作另一个表达式的一部分:

new[] { 1, 2, 3 }
new int[] { 1, 2, 3 }
new int[3] { 1, 2, 3 }
new int[,] { { 1, 2, 3 } }
... and so on
Run Code Online (Sandbox Code Playgroud)

或作为集合初始化程序的一部分:

new List<int> { 1, 2, 3 }
Run Code Online (Sandbox Code Playgroud)

或在变量声明中:

int[] x = { 1, 2, 3 };
Run Code Online (Sandbox Code Playgroud)

在需要表达式的任何其他上下文中使用数组初始化程序语法是合法的.例如:

int[] x;
x = { 1, 2, 3 }; 
Run Code Online (Sandbox Code Playgroud)

不合法.

这只是C#语言的一个奇怪的角落.你发现的不一致没有更深层次的含义.