从交错数组初始化中省略c#new

从交错数组初始化中省略c#new,c#,new-operator,jagged-arrays,C#,New Operator,Jagged Arrays,发件人: 请注意,不能从元素初始化中忽略新运算符,因为元素没有默认初始化: 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[][] 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 } } };
本质上,答案是“因为他们(指语言设计师)选择不这样做。引用Eric Lippert的话:

每个未实现的功能未实现的原因相同: 默认情况下,功能未实现。为了实现 特性必须(1)考虑,(2)设计,(3)指定,(4) 实施,(5)测试,(6)记录和(7)装运

更严格地说,这是一个很好的理由,与一维和多维数组相比,这是锯齿数组的定义

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

既然我们知道交错阵列在实现上与多维阵列有很大的不同,我们还可以假设为什么对2有不同级别的集成支持。添加支持当然不是不可能的,只是需求和时间的问题


(作为一个玩笑,为什么只添加对锯齿阵列的支持?您自己的自定义类型如何?

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

您在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;
x = { 1, 2, 3 }; 
这是不合法的


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

可能是技术原因,比如语法歧义,或者是一些使词法分析过于复杂的角落。C语言设计者倾向于简单(或现状)方面的错误在这种情况下,特别是当使用概率很低,并且有相当等效的语法不会打断程序员的使用。也许只是允许它会允许一些噩梦般的解析案例…@ChrisSinclair,那没关系,但我不理解他们给出的解释(没有默认初始化)。int-foo[]是否默认初始化而不使用new?对我来说,它似乎缺少了一点语法糖。在普通C中,锯齿数组可以很容易地通过包含指针的数组来实现。这种情况就发生了。:)我只是想深入研究C#的一些特殊情况(如果我做了这个或那个会发生什么,以及为什么它不起作用),MSDN不是很精确,什么是{1,2,3},甚至它是一种语法糖,我希望它也能在锯齿数组上起作用。似乎我错了。
int[] x;
x = { 1, 2, 3 };