C# 它为什么要编译? var cv=(新的CustomValidator() { ErrorMessage=“投资于意大利电信的格式”, ControlToValidate=“txtTelefoneIni”,因为它是合法语法

C# 它为什么要编译? var cv=(新的CustomValidator() { ErrorMessage=“投资于意大利电信的格式”, ControlToValidate=“txtTelefoneIni”,因为它是合法语法,c#,asp.net,C#,Asp.net,真的,是的 使用对象初始值设定项语法构造对象时,允许在最后一项后留下逗号,即使在此处结束初始值设定项块 它背后的原因可能是它使以后更容易返回并编辑它,因为忘记在前面的最后一项后添加逗号是对象初始值设定项的编译时问题。这是故意的。也适用于枚举成员。(因此更容易添加更多内容)为什么不编译 这种语法在Python中也是合法的。它可以编译,因为它是有效的C#语法。你也可以对数组做同样的事情 string[]meh={“a”、“b”、“c”、};,因为它是允许的。 一般来说,允许在这种形式中使用逗号结尾(

真的,是的

使用对象初始值设定项语法构造对象时,允许在最后一项后留下逗号,即使在此处结束初始值设定项块


它背后的原因可能是它使以后更容易返回并编辑它,因为忘记在前面的最后一项后添加逗号是对象初始值设定项的编译时问题。

这是故意的。也适用于枚举成员。(因此更容易添加更多内容)

为什么不编译


这种语法在Python中也是合法的。

它可以编译,因为它是有效的C#语法。你也可以对数组做同样的事情

string[]meh={“a”、“b”、“c”、};

,因为它是允许的。 一般来说,允许在这种形式中使用逗号结尾(并实际使用该“特权”)是很有用的,这样程序员就可以向列表中添加更多的项,而不会忘记在前一项的末尾添加逗号。

这在C语言中是一种有效的语法#

让我们看看

            var cv = (new CustomValidator()
            {
                 ErrorMessage="Formato de telefone inválido",
                 ControlToValidate = "txtTelefoneIni", //<-- see the extra comma
            });
var c=newlist(){1,2,3,};

它是:对象初始值设定项的一部分。

FWIW,它在C中已经有效

使用这种语法(特别是在定义枚举时)我最喜欢的原因是,当您向列表中添加一个项时,源代码管理仅在一行(新的一行)中看到更改。它不会将前一行标记为已修改(因为添加了逗号)。更具可读性的差异


我的2美分。

这是合法的,cv成为了一个新的CustomValidator。cv的字段被显式初始化,而不是通过构造函数传递参数。我认为这是因为SQL ANSI和JScript不允许我们做这样的事情。IE不允许在JavaScript中使用尾随逗号一直是我们许多小错误的来源。尽管它不像IE那样做esn不允许这样做,它只是在数组的末尾添加了一个
未定义的
元素。SQL和JScript是其他语言,它们不是C#3.0或Python。我听说为了编写代码生成器的人的利益,这是合法的。谁知道呢?我觉得有点草率。从版本控制的角度来看,这也很好——你可以再添加一个她的输入没有修改任何行,因此差异更干净。老实说,我对此持两种观点。我个人不添加逗号,我在需要时添加它们,但我也看到了代码生成器的意义,我也使用它,所以这不是一个完美的解决方案。无论如何,它会一直存在。我个人也喜欢有人否决它s、 这就像“嘿,我不同意C#spec!!!!1111oneoneleven”,然后不评论我的答案有什么问题。后面的逗号在枚举中也是合法的。我认为它使编辑更容易。如果你想更改项目的顺序,你不必在之后修复逗号。
var c = new List<int>() { 1, 2, 3 ,};