fea*_*net 18 c# compiler-construction syntax
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; }
}
Run Code Online (Sandbox Code Playgroud)
我在代码中发现了上述错字.我总是很惊讶编译器似乎并不关心这一点.为什么以上不是语法错误?它真的有用吗?
T.J*_*der 18
我在代码中发现了上述错字.我总是很惊讶编译器似乎并不关心这一点.为什么以上不是语法错误?
因为人们在设计C#语法文法足够聪明,学习其他编程语言的教训,并没有让悬空的逗号,在这些语言的编程人员的不断刺激.
例如,ECMAScript(JavaScript)最初对此问题保持沉默,因此一些实现(Firefox中的SpiderMonkey,Opera的JavaScript等)自然允许它们,而其他实现(Microsoft的JScript)则没有.因此,这引发了一连串"为什么这在IE中不起作用"的问题在这里和其他地方.(幸运的是,ECMAScript 5明确地允许它们,并且IE8最终在对象初始化器中支持它们 - IE8仍然以非标准的方式处理数组初始化器,但公平地说,那些悬挂的逗号只在ECMAScript 5中得到澄清.)
你可以在C#语法的许多其他地方找到它,比如枚举和数组初始化器.
这不是错误,因为它很方便.要添加到初始值设定项,您只需添加一行而不是将逗号添加到一行并输入一个全新的行.
这在其他语言的列表/数组初始化中实际上相当普遍(Python,Ruby,Haskell可以想到).
我认为它可以简化自动代码生成.
在这种情况下,您可以使用某种程序创建这样的代码
...
for( char c = 'A'; c < 'Z'; c++ )
{
AddToOutput( c + " = \"+c.ToLower()+"\"," );
}
...
Run Code Online (Sandbox Code Playgroud)
并且不必关心删除最后一个尾随逗号.