内联属性初始化和尾随逗号

void Main() { Test t = new Test { A = "a", B = "b", // <-- erroneous trailing comma }; } public class Test { public string A { get; set; } public string B { get; set; } } 

我在代码中发现了上述错字很多。 我总是很惊讶编译器似乎并不关心这一点。 为什么以上不是语法错误? 它真的有用吗?

我在代码中发现了上述错字很多。 我总是很惊讶编译器似乎并不关心这一点。 为什么以上不是语法错误?

因为设计C#语法语法的人非常聪明,可以从其他编程语言中吸取教训,这些编程语言不允许使用悬空的逗号,这些语言中的程序员经常受到刺激。

例如,ECMAScript(JavaScript)最初对此问题保持沉默,因此一些实现(Firefox中的SpiderMonkey,Opera的JavaScript等)自然允许它们,而其他实现(Microsoft的JScript)则没有。 因此,这引发了一连串“为什么这不能在IE中工作”这里和其他地方的问题。 (幸运的是,ECMAScript 5明确地允许它们,并且IE8最终在对象初始化器中支持它们 – IE8仍然以非标准的方式处理数组初始化器,但为了公平起见,那些悬挂的逗号只在ECMAScript 5中得到澄清。)

您可以在C#语法的许多其他地方找到它,比如枚举和数组初始值设定项。

我认为可以简化自动代码生成。

在这种情况下,您可以使用某种程序创建这样的代码

 ... for( char c = 'A'; c < 'Z'; c++ ) { AddToOutput( c + " = \"+c.ToLower()+"\"," ); } ... 

并且不必关心删除最后一个尾随逗号。

这不是错误,因为它很方便。 要添加到初始值设定项,您只需添加一行而不是将逗号添加到一行并输入一个全新的行。

这在其他语言的列表/数组初始化中实际上相当普遍(Python,Ruby,Haskell)。