【问题标题】:Why this strange behaviour?为什么会出现这种奇怪的行为?
【发布时间】:2012-05-12 06:52:59
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# .net c#-4.0


    【解决方案1】:

    相当古老的文档,但仍然相关。你看的是Array Initializers

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

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


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

    【讨论】:

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

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

      【讨论】:

        【解决方案3】:
        1. 首先是由于其他人提到的数组初始化器。使用 Object Initializers, and Collection Initializers 将类似的行为扩展到其他对象。

        2. 查看 Jon Skeet 对.NET now support trailing comma in array like python does 的回答

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-27
          • 2015-10-05
          • 1970-01-01
          • 2011-03-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多