0

我无法理解这两种奇怪的行为

1. 第一行为

我已经声明了一个这样的变量

double[][] dd =
{
    new double[10],
    new double[10]
};

它不会给出错误。

但是,如果我这样做,它会给出错误

double[][] dd;

dd = { // Here it gives 2 errors says Invalid Expression { and ; expected 
      new double[10], 
      new double[10] //Here and in the above line it says only  
                     //assignment, call, increment....can be used as a statement
     };

如果我这样做,错误就消失了

double[][] dd;

dd = new double[][]{
                     new double[10],
                     new double[10]
                   };

为什么?

2. 第二种行为

,此外,在上述任何情况下,如果在数组的最后一个元素之后放置一个额外的逗号,则不会出错

{
 new double[10],
 new double[10], //This comma here is not given as error. Why?
};

如果该额外的逗号未指定应在其后添加一个实体。

4

3 回答 3

4

相当古老的文档,但仍然相关。您正在查看的是Array Initializers

可以在字段声明(第 10.4 节)、局部变量声明(第 8.5.1 节)和数组创建表达式(第 7.5.10.2 节)中指定数组初始值设定项。

请注意,它并没有说它们在赋值语句中可用,这是您在第一个错误时尝试的。


对于您的第二个问题,允许额外的原因,是方便 - 如果您不必对第一项或最后一项进行特殊处理,那么如果以编程方式生成代码,这将特别有用。您会在例如枚举声明中找到类似的语法。

于 2012-05-12T06:57:31.093 回答
1
  1. 您的示例是 C# 的Array Initializer语法的示例。初始化表达式只能出现在定义变量的行上。在我看来,您希望该{}符号很像 Python 或 Ruby 的[]数组文字表达式。他们不是真的。

  2. 它允许尾随逗号只是为了更容易更统一地拥有一个进入初始化程序的项目列表,这些项目会随着时间的推移而改变长度。例如,既然你有那个逗号,那么在末尾添加一个新项目只涉及编辑一行,而不是编辑一行来添加逗号和另一行来添加新内容。

于 2012-05-12T06:59:26.210 回答
0
  1. 首先是由于其他人提到的数组初始化器。使用 Object Initializers 和 Collection Initializers将类似的行为扩展到其他对象。

  2. 请参阅.NET 的 Jon Skeet 答案现在支持数组中的尾随逗号,就像 python 一样

于 2012-05-13T02:39:44.543 回答