枚举仅包含部分成员的指定值

Guy*_*Guy 7 c# enums

enum只有部分列表的自定义值

public enum MyEnum
{
    FirstValue,
    SecondValue,
    ThirdValue,
    ForthValue = 1,
    FifthValue = 2
}
Run Code Online (Sandbox Code Playgroud)

当我试着strina name = (MyEnum)2;名字的时候ThirdValue.

但是当我改变enum

public enum MyEnum
{
    FirstValue = 3,
    SecondValue,
    ThirdValue,
    ForthValue = 1,
    FifthValue = 2
}
Run Code Online (Sandbox Code Playgroud)

strina name = (MyEnum)2;名字中FifthValue.

编译器(我正在使用Visual Studio 2012)是否仅在第一个具有自定义值时初始化自定义值?

如果ThirdValue在第一个例子中得到默认值2,那么怎么没有错误FifthValue = 2呢?

Wai*_*Lee 7

为枚举成员分配值时,编译器会为下一个成员将值递增1,除非已定义.如果没有成员具有值,则编号从0开始.

你的第一个例子,编译器正在做的是:

public enum MyEnum
{
    FirstValue,    // == 0
    SecondValue,   // == 1
    ThirdValue,    // == 2
    ForthValue = 1,
    FifthValue = 2
}
Run Code Online (Sandbox Code Playgroud)

所以你有两个有价值的成员2.

要么给它们所有的值,要么给它们没有值.任何其他事情都可能导致混乱.

C#标准,第14.3节说(强调我的):

枚举成员的关联值是隐式或显式指定的.如果枚举成员的声明具有常量表达式初始值设定项,则该常量表达式的值(隐式转换为枚举的基础类型)是枚举成员的关联值.如果枚举成员的声明没有初始值设定项,则隐式设置其关联值,如下所示:

  • 如果枚举成员是枚举类型中声明的第一个枚举成员,则其关联值为零.
  • 否则,通过将文本上在前的枚举成员的关联值增加1来获得枚举成员的关联值.此增加的值必须在可由基础类型表示的值范围内; 否则,发生编译时错误.