为什么我需要 "new" 来进行锯齿状数组初始化?

Why do I need "new" for jagged array initialization?

过去我使用完整的初始化语法初始化数组:

int[] arr = new int[1] { 1 };

但是一旦我发现我不需要在初始化期间指定类型,我就停止这样做了:

int[] arr = { 1 };

我最近再次研究了锯齿状数组,发现这种语法有一个非常奇怪的问题:

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

上面的代码无效,这让我很困惑。此外,这种语法很好:

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

显然这里唯一的区别是 "new" 关键字。通常,在其他语言中,"new" 关键字表示变量将成为引用类型,但在 C# 中,数组始终是引用类型,因此实际上不需要为数组指定 "new"。有谁知道为什么我需要在这个锯齿状的数组初始化中在这里指定它?这是一个错误,还是只是一个未实现的编译器功能?

Is this a bug?

没有。

Does anyone know why I need to specify it here in this jagged array initialization?

对于 C# 语言必须只允许矩形多维数组而不是锯齿状多维数组的数组初始值设定项语法,没有基本的理论理由。

您想要的功能不存在,因为没有人设计、指定、实施、测试、记录和交付该功能。这是因为与您可以花时间的几乎所有其他可能功能相比,该功能可以合理地描述为非常非常不重要。功能很昂贵;设计团队尝试将时间花在解决实际用户问题的功能上。

小 "sugar" 功能(如您建议的功能)确实得到了实施;例如,表达式体方法。但是几乎每个程序都包含小方法。绝大多数程序甚至不包含一个锯齿状的、初始化一次的数组,因此这一功能几乎可以节省六次击键。不值得。

maybe just an unimplemented compiler feature that will be fixed in a future version of C#?

如果这个功能对你很重要,那么,设计和实现过程是开放的。欢迎提出、设计、指定、实施、测试和记录功能,看看他们是否接受您的拉取请求。