为何这种奇怪的行为?

时间:2012-05-12 06:52:59

标签: c# .net c#-4.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?
};

这个额外的逗号是否应该指定在其之后添加一个实体。

3 个答案:

答案 0 :(得分:4)

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

  

可以在字段声明(第10.4节),局部变量声明(第8.5.1节)和数组创建表达式(第7.5.10.2节)。

请注意,它并未表示它们在赋值语句中可用,这是您尝试处理第一个错误时的错误。


对于您的第二个问题,允许额外,的原因是方便 - 如果您不需要特殊情况下的第一个或最后一个项目,则以编程方式生成代码时特别有用。你会发现类似的语法,例如枚举声明。

答案 1 :(得分:1)

  1. 您的示例是C#Array Initializer语法的示例。初始化表达式只能出现在定义变量的行上。在我看来,你期望{}符号更像是Python或Ruby的[]数组文字表达式。他们不是真的。

  2. 它允许使用尾随逗号简单地使得更加统一,以便在初始化程序中包含随时间变化长度的项目列表。例如,由于您在那里有逗号,因此在末尾添加新项目只涉及编辑一行,而不是编辑一行以添加逗号,另一行添加新内容。

答案 2 :(得分:0)

  1. 首先是由于其他人提到的Array Initializers。使用对象Initializers, and Collection Initializers将类似行为扩展到其他对象。

  2. 请参阅.NET now support trailing comma in array like python does

  3. 的Jon Skeet答案