为什么这个c#片段合法?
愚蠢的问题,但为什么以下行编译?
int[] i = new int[] {1,};
如您所见,我没有进入第二个元素并在那里留下逗号。 即使你不期望它仍然编译。
我想因为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 , } ↑
PS是一个很好的答案(即使这个事实已被许多用户指出)。 🙂
尾随逗号可用于简化自动代码生成器的实现(生成器可以避免测试初始化程序中的最后一个元素,因为它应该在没有尾随逗号的情况下编写)和使用预处理程序指令进行条件数组初始化。
这是语法糖。 特别是,这种记录在代码生成中很有用。
int[] i = new int[] { 1, 2, 3, };
此外,当您这样写时,要添加新行,您只需要在一行中添加文本。
它应该按定义编译。
没有第二个元素。 在定义项集合时,尾随逗号是有效的语法。
i
是一个包含单个元素的int
数组, i[0]
包含值1
。
允许尾随逗号的另一个好处是与预处理程序指令相结合:
int[] i = new[] { #if INCLUDE1 1, #endif #if INCLUDE2 2, #endif #if INCLUDE3 3, #endif };
如果不允许使用尾随逗号,那么编写起来就会困难得多。
所以你可以这样做并复制/粘贴线条而不用担心在正确的地方删除/添加逗号。
int[] i = new[] { someValue(), someOtherValue(), someOtherOtherValue(), // copy-pasted zomg! the commas don't hurt! someValue(), someOtherValue(), someOtherOtherValue(), };
枚举也一样:
enum Foo { Bar, Baz, };