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

Ser*_*sev 15 c# compilation

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

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

var obj = new { field1 = "Test", field2 = 3, }
Run Code Online (Sandbox Code Playgroud)

编译和执行正常,没有任何错误甚至警告和工作完全一样

var obj = new { field1 = "Test", field2 = 3 }
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Jon*_*eet 39

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

anonymous-object-creation-expression:    
    new   anonymous-object-initializer

anonymous-object-initializer:  
    { member-declarator-listopt }  
    { member-declarator-list , }
Run Code Online (Sandbox Code Playgroud)

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

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

var obj = new { 
    field1 = "test", 
    field2 = 3,
};
Run Code Online (Sandbox Code Playgroud)

可以变成

var obj = new { 
    field2 = 3,
};
Run Code Online (Sandbox Code Playgroud)

要么

var obj = new { 
    field1 = "test", 
    field2 = 3,
    field3 = 4,
};
Run Code Online (Sandbox Code Playgroud)

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

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

// These are all valid
string[] array = { "hello", };
List<string> list = new List<string> { "hello", };
enum Foo { Bar, }
Run Code Online (Sandbox Code Playgroud)

  • 我认为这里的最强点是代码生成器。让我们都面对现实吧,这是一个我们希望所有语言都拥有的非常好的功能。 (2认同)

小智 13

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

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

var obj = new {
  field1 = "Test",
  field2 = 3,
  field3 = "New",
  }
Run Code Online (Sandbox Code Playgroud)