来自: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 } } };
答案 0 :(得分: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
或作为集合初始值设定项的一部分:
new List<int> { 1, 2, 3 }
或在变量声明中:
int[] x = { 1, 2, 3 };
在需要表达式的任何其他上下文中使用数组初始化程序语法是不合法。例如:
int[] x;
x = { 1, 2, 3 };
不合法。
这只是C#语言的一个奇怪的角落。对于你发现的不一致性没有更深层的含义。
答案 1 :(得分:1)
本质上答案是“因为他们(意思是语言设计师)选择不这样做。引自Eric Lippert:
为什么没有实现每个未实现的功能的原因相同: 默认情况下,功能未实现。为了实施 一个特征必须是(1)思想,(2)设计,(3)指定,(4) 实施,(5)测试,(6)记录和(7)发货。
从技术上讲,有一个很好的理由,这就是锯齿形阵列与一维和多维阵列相比的定义。
一个或多个维度数组可以用简单的英语表示为T的X维数组,其中锯齿状数组必须表示为T的数组数组。在第二种情况下,它之间存在松耦合。内部数组和外部数据。也就是说,您可以将新数组分配给外部数组中的位置,而x维数组则是固定的。
现在我们知道Jagged数组在实现中与多维数组非常不同,我们也可以假设为什么对于2有不同级别的集成支持。添加支持肯定不是不可能,只是一个问题需求和时间。
(作为预告片,为什么只添加对锯齿状数组的支持?你自己的自定义类型怎么样?)