.NET Enumeration允许在最后一个字段中使用逗号

asy*_*ait 42 .net c# enums

为什么.NET枚举允许在最后一个字段中使用逗号?
这有什么特别的意义吗?

[FlagsAttribute]
public enum DependencyPropertyOptions : byte
{
           Default = 1,
           ReadOnly = 2,
           Optional = 4,
           DelegateProperty = 32,
           Metadata = 8,
           NonSerialized = 16,
}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ver 63

它没有特殊意义,只是编译器的工作方式,它主要是出于这个原因:

[FlagsAttribute]
public enum DependencyPropertyOptions : byte
{
           Default = 1,
           ReadOnly = 2,
           Optional = 4,
           DelegateProperty = 32,
           Metadata = 8,
           NonSerialized = 16,
           //EnumPropertyIWantToCommentOutEasily = 32
}
Run Code Online (Sandbox Code Playgroud)

通过评论请求:此信息直接来自C#规范(第355页/第17.7节)

与标准C++一样,C#允许在数组初始化器的末尾使用尾随逗号.此语法提供了从此类列表中添加或删除成员的灵活性,并简化了此类列表的计算机生成.

  • 编译器按照语言规范工作(我认为,有一些例外).语法语法指定在这种情况下无关的逗号是合法的(并且在其他一些例如对象初始化器,集合初始化器和数组初始化器中).此外,除非你知道语法是出于这个原因设计的,否则说它给你列出的好处可能更正确.如果没有这方面的第一手知识,我不会声称知道语言委员会的动机. (2认同)
  • @Jason澄清一下,这不是我的想法,它实际上在 C# 规范中指出:http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf(第363页/部分19.7) “与标准 C++ 一样,C# 允许在数组初始化程序末尾使用尾随逗号。此语法提供了在此类列表中添加或删除成员的灵活性,并简化了此类列表的机器生成。” (2认同)
  • 然而该列表不是初始化数组,而是定义枚举。它仍然被视为数组初始化程序吗?或者标准中是否有其他专门针对枚举的规定? (2认同)
  • 啊,对于枚举 ECMA-334,第 21.1 节最后说:“[注意:C# 允许在枚举体中使用尾随逗号,就像它允许在数组初始值设定项中使用逗号一样(第 19.6 节)。尾注]”。 (2认同)

Ser*_*kov 12

另外(对于Nick Craver的帖子)更容易添加新的枚举.

此行为不适用于枚举.考虑以下:

var list = new int[] { 1, 2, 3, };
Run Code Online (Sandbox Code Playgroud)


Not*_*tMe 10

另一个原因:它使编码gen变得更容易.


len*_*ndc 5

我知道这是一个古老的话题,但是对于此问题有意义的另一种方法是代码版本控制系统。

考虑以下示例:

//version 1
var myArray = {
    "item 1",
    "item 2"
};
//version 2
var myArray = {
    "item 1",
    "item 2", //will be considered a change, it may be considered an erroneous approach
    "item 3"
}
Run Code Online (Sandbox Code Playgroud)

现在考虑这种方法:

//version 1
var myArray = {
    "item 1",
    "item 2",
};
//version 2
var myArray = {
    "item 1",
    "item 2", //will not be considered a change, it may be considered an erroneous approach too, but, means that the code wasn't changed intrinsically
    "item 3",
};
Run Code Online (Sandbox Code Playgroud)

无论如何,根据情况,这两种方法都可能被认为是不正确或正确的。我特别喜欢在处理代码版本控制系统时更有意义的第二种方法。

无论如何希望这会有所帮助。