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

来自: 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} }; 

这是什么意思?

为什么可以省略新的:

 int[] arrSimp = { 1, 2, 3 }; int[,] arrMult = { { 1, 1 }, { 2, 2 }, { 3, 3 } }; 

但不可能:

 int[][,] arrJagg = {new int[,] { { 1, 1} }, new int[,] { { 2, 2 } }, new int[,] { { 3, 3 } } }; 

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

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

你在C#分类表达式的方式中发现了一个小的“疣”。 事实certificate,数组初始化器语法{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 

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

 new List { 1, 2, 3 } 

或在变量声明中:

 int[] x = { 1, 2, 3 }; 

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

 int[] x; x = { 1, 2, 3 }; 

不合法。

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

本质上答案是“因为他们(意思是语言设计师)选择不这样做。”Eric Lippert引用:

未实现每个未实现function的原因相同:默认情况下未实现function。 为了实现一个特征必须(1)思考,(2)设计,(3)指定,(4)实施,(5)测试,(6)记录和(7)发货。

从技术上讲,有一个很好的理由,这就是与一维和多维数组相比的锯齿状数组的定义。

一个或多个维度数组可以用简单的英语表示为T的X维数组,其中锯齿状数组必须表示为T的数组数组。在第二种情况下,内部数组和内部数组之间存在松耦合。外面的文学。 也就是说,您可以将新数组分配给外部数组中的位置,而ax维数组则是固定的。

现在我们知道Jagged数组在实现中与多维数组非常不同,我们也可以假设为什么对于2有不同级别的集成支持。添加支持肯定不是不可能,只是需求问题和时间。

(作为预告片,为什么只添加对锯齿状数组的支持?你自己的自定义类型怎么样?)