为什么C#4.0容忍匿名对象初始化代码中的尾随逗号?

可能重复:
内联属性初始化和尾随逗号

在我的一个项目(C#4.0,Visual Studio 2010)上工作,我意外地发现了代码

var obj = new { field1 = "Test", field2 = 3, } 

编译和执行确定没有任何错误甚至警告,并且工作完全一样

 var obj = new { field1 = "Test", field2 = 3 } 

为什么编译器在第一个例子中容忍尾随昏迷? 这是编译器中的错误还是这样的行为确实有一些目的?

谢谢

要确定它是否是编译器中的错误,您需要查看C#规范 – 在本例中的7.6.10.6部分,它明确允许它:

 anonymous-object-creation-expression: new anonymous-object-initializer anonymous-object-initializer: { member-declarator-listopt } { member-declarator-list , } 

所以不,这不是编译器错误。 该语言是故意设计的,以允许它。

现在, 为什么语言的设计方式如此 – 我相信这样可以更容易在编码时添加和删除值。 例如:

 var obj = new { field1 = "test", field2 = 3, }; 

可以变成

 var obj = new { field2 = 3, }; 

要么

 var obj = new { field1 = "test", field2 = 3, field3 = 4, }; 

通过添加或删除一行。 这使得维护代码更简单,并且更容易编写代码生成器。

请注意,这与数组初始值设定项,集合初始值设定项和枚举一致:

 // These are all valid string[] array = { "hello", }; List list = new List { "hello", }; enum Foo { Bar, } 

尾随逗号好的一个原因是源Compares。 如果更新源并使用源比较工具,则源比较工具将仅显示1行已更改(新字段3.如果没有尾随逗号,则源比较将显示2行已更改,因为您必须添加逗号在3号之后。

 var obj = new { field1 = "Test", field2 = 3, } var obj = new { field1 = "Test", field2 = 3, field3 = "New", } 

我想,为了更容易删除最后一个字段。 这样做在语法中确实没有引起歧义,所以它只会让生活变得更轻松。