新Foo {A = 1,} Bug或功能?

时间:2012-05-24 12:27:14

标签: c# c#-4.0

以下C#代码段在我的Visual Studio 2010下编译并运行:

struct Foo {
    public int A;
}

// ..

var foo = new Foo { A = 1, };

请注意对象初始值设定项中的尾随逗号。

这是合法的C#并且它是否有任何有用的用途,或者我刚刚遇到(良性)编译器错误?

3 个答案:

答案 0 :(得分:9)

Yes it is very much legal and useful in C# to have trailing commas and no it is not a (benign) compiler bug.

为方便起见,Microsoft添加了该功能 - 如果您不需要特殊情况下的第一个或最后一个项目,则以编程方式生成代码时,它特别有用。您将在枚举声明中找到类似的语法,在对象初始化,数组,列表等中分配属性。

它允许使用尾随逗号简单地使得更加统一,以便在初始化程序中包含随时间变化长度的项目列表。例如,由于您有逗号,因此在末尾添加新项目只涉及编辑一行,而不是编辑一行以添加逗号,而另一行则添加新内容。

此外,如果你注释掉最后一个选项

,该怎么办?
enum Cars
{
   Honda,
   Hyundai,
   //Ford
}

请参阅.NET now support trailing comma in array like python does

的Jon Skeet答案

Food for thought: If it had no use why would it be there in the first place?

答案 1 :(得分:4)

如果注释掉最后一项会导致编译错误,那将会很烦人:

var f = new Foo {
    A = 1,
//  B = 4
};

[Flags]
enum Characteristics
{
    None = 0,
    Big = 1,
//  Strong = 2
}

var primes = new int[] {
    2,
    3,
//  5
};

答案 2 :(得分:0)

是合法且没有特定目的。