在我的一个项目(C#4.0,Visual Studio 2010)上工作时,我偶然发现了像
这样的代码var obj = new { field1 = "Test", field2 = 3, }
编译并执行正常,没有任何错误甚至警告,并且与
完全相同var obj = new { field1 = "Test", field2 = 3 }
为什么编译器在第一个例子中容忍尾随昏迷?这是编译器中的错误还是这样的行为确实有用?
由于
答案 0 :(得分:39)
要确定它是否是编译器中的错误,您需要查看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<string> list = new List<string> { "hello", };
enum Foo { Bar, }
答案 1 :(得分:13)
尾随逗号好的一个原因是源Compares。如果更新源并使用源比较工具,则源比较工具将仅显示1行已更改(新字段3.如果没有尾随逗号,则源比较将显示2行已更改,因为您必须添加逗号在3号之后。
var obj = new {
field1 = "Test",
field2 = 3,
}
var obj = new {
field1 = "Test",
field2 = 3,
field3 = "New",
}
答案 2 :(得分:3)
为了更容易删除最后一个字段,我想。这样做在语法中确实没有引起歧义,所以它只会让生活变得更轻松。