为什么这个c#片段合法?

时间:2010-03-02 06:24:06

标签: c# grammar

愚蠢的问题,但为什么以下行编译?

int[] i = new int[] {1,};

如您所见,我没有进入第二个元素并在那里留下逗号。即使你没想到也会编译。

6 个答案:

答案 0 :(得分:11)

我想因为ECMA 334标准说:

array-initializer:
    { variable-initializer-list(opt) }
    { variable-initializer-list , }
variable-initializer-list:
    variable-initializer
    variable-initializer-list , variable-initializer
variable-initializer:
    expression
    array-initializer

如您所见,允许使用尾随逗号:

{ variable-initializer-list , }
                            ↑

P.S。一个好的答案(即使这个事实已被许多用户指出)。 :)

可以使用尾随逗号来简化自动代码生成器的实现(生成器可以避免在初始化程序中测试最后一个元素,因为它应该在没有尾随逗号的情况下编写)和使用预处理程序指令进行条件数组初始化。

答案 1 :(得分:10)

这是语法糖。特别是,这种记录在代码生成中很有用。

int[] i = new int[] {
    1,
    2,
    3,
};

此外,当您这样写时,要添加新行,您只需要在一行中添加文字。

答案 2 :(得分:7)

它应按定义编译。

没有第二个元素。在定义项集合时,尾随逗号是有效的语法。

i是一个int数组,其中包含一个元素i[0],其中包含值1

答案 3 :(得分:7)

允许尾随逗号的另一个好处是与预处理程序指令结合使用:

int[] i = new[] {
#if INCLUDE1
   1,
#endif

#if INCLUDE2
   2,
#endif

#if INCLUDE3
   3,
#endif
};

不允许使用尾随逗号,这样写起来会困难得多。

答案 4 :(得分:5)

它可以这样做并复制/粘贴线条,而不必担心在正确的位置删除/添加逗号。

int[] i = new[] { 
   someValue(),
   someOtherValue(),
   someOtherOtherValue(),

   // copy-pasted zomg! the commas don't hurt!
   someValue(),
   someOtherValue(),
   someOtherOtherValue(),

};

答案 5 :(得分:3)

枚举也一样:

enum Foo
{
  Bar,
  Baz,
};