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

时间:2013-01-24 01:10:08

标签: c# new-operator jagged-arrays

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

2 个答案:

答案 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有不同级别的集成支持。添加支持肯定不是不可能,只是一个问题需求和时间。

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