4

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

这是什么意思?

为什么可以忽略 new in:

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

2 回答 2

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# 语言的一个奇怪的极端情况。您发现的不一致没有更深层次的含义。

于 2013-01-24T16:29:14.917 回答
1

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

与每个未实现的特性都没有实现的原因相同:特性默认情况下是未实现的。为了实现一个特性,必须(1)考虑,(2)设计,(3)指定,(4)实施,(5)测试,(6)记录和(7)交付。

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

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

既然知道了Jagged数组在实现上与多维数组有很大的不同,那我们也可以推测一下为什么对2的集成支持程度不同了。当然不是不可能加支持,只是需求的问题和时间。

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

于 2013-01-24T03:15:31.273 回答