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

Vin*_*cio 9 c# grammar

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

int[] i = new int[] {1,};
Run Code Online (Sandbox Code Playgroud)

如你所见,我没有进入第二个元素并在那里留下逗号.即使你不期望它仍然编译.

Luc*_*uca 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
Run Code Online (Sandbox Code Playgroud)

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

{ variable-initializer-list , }
                            ?
Run Code Online (Sandbox Code Playgroud)

PS是一个很好的答案(即使这个事实已被许多用户指出).:)

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


Ste*_*eck 10

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

int[] i = new int[] {
    1,
    2,
    3,
};
Run Code Online (Sandbox Code Playgroud)

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

  • 它在枚举中被允许(仅在C#3.0中尝试过) (3认同)

Mit*_*eat 7

它应该按定义编译.

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

i是一个int包含单个元素的数组,i[0]包含该值1.

  • 这可能是你的解释,但这不是它的定义方式. (7认同)
  • 但它仍然是答案.由于规范,该片段是合法的,而Jimmy给出了这个决定背后的推理. (2认同)

R S*_*hko 7

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

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

#if INCLUDE2
   2,
#endif

#if INCLUDE3
   3,
#endif
};
Run Code Online (Sandbox Code Playgroud)

如果不允许使用尾随逗号,那么编写起来就会困难得多.


Jim*_*mmy 5

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

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

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

};
Run Code Online (Sandbox Code Playgroud)