繁体   English   中英

为什么会有这种奇怪的行为?

[英]Why this strange behaviour?

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

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?
};

如果该多余的逗号未指定在其后再添加一个实体。

相当老的文档,但仍然有用。 您正在查看的是数组初始化器

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

请注意,这并不是说它们在赋值语句中可用,这是您尝试第一个错误时要采取的措施。


你的第二个问题,为什么多余的原因,被允许是方便-如果正在编程生成的代码,如果你没有特殊的情况下,第一个或最后一个项目是特别有用。 您会在例如枚举声明中找到类似的语法。

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

  2. 它允许后缀逗号只是为了使其更容易统一,以便在初始化程序中使用随时间变化长度的项目列表。 例如,由于您在那里有逗号,因此在末尾添加新项仅涉及编辑一行,而无需编辑一行以添加逗号,而编辑另一行以添加新内容。

  1. 首先是由于其他人提到的数组初始化器。 使用Object Initializers和Collection Initializers将类似的行为扩展到其他对象。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM