为什么我需要“新”来进行锯齿状数组初始化?

时间:2018-02-13 21:00:43

标签: c# arrays jagged-arrays

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

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”。有谁知道为什么我需要在这个锯齿状数组初始化中指定它?这是一个错误,还是只是一个未实现的编译器功能?

1 个答案:

答案 0 :(得分:8)

  

这是一个错误吗?

不。

  

有谁知道为什么我需要在这个锯齿状数组初始化中指定它?

没有基本的理论上的理由说明为什么C#语言必须只允许矩阵多维数组的数组初始化语法,而不是锯齿状的多维数组。

您想要的功能不存在,因为没有人设计,指定,实施,测试,记录和发送该功能。这是因为与几乎任何其他可能花费时间的功能相比,该功能可以合理地表征为非常非常不重要。功能昂贵;设计团队试图花时间处理解决实际用户问题的功能。

像您建议实施的那些小“糖”功能;例如,表达体方法。但几乎每个程序都包含小方法。绝大多数程序甚至不包含一个锯齿状的初始化一次数组,因此这个功能可以节省几乎没有六个键击。不值得。

  

可能只是一个未实现的编译器功能,将在未来的C#版本中修复?

如果此功能对您很重要,那么设计和实施过程就是开放的。随意提出,设计,指定,实施,测试和记录该功能,看看他们是否接受您的拉取请求。