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

时间:2016-02-04 14:12:12

标签: c# enums

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

public enum MyEnum
{
    FirstValue,
    SecondValue,
    ThirdValue,
    ForthValue = 1,
    FifthValue = 2
}

当我尝试strina name = (MyEnum)2;名称为ThirdValue时。

但是当我将enum更改为

public enum MyEnum
{
    FirstValue = 3,
    SecondValue,
    ThirdValue,
    ForthValue = 1,
    FifthValue = 2
}

strina name = (MyEnum)2;名称为FifthValue

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

如果ThirdValue在第一个示例中得到默认值2,那么FifthValue = 2中是否有任何错误?

3 个答案:

答案 0 :(得分:6)

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

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

public enum MyEnum
{
    FirstValue,    // == 0
    SecondValue,   // == 1
    ThirdValue,    // == 2
    ForthValue = 1,
    FifthValue = 2
}

所以你有两个成员,其值为2

为他们提供所有值,或者不给他们任何值。任何其他事情都可能导致混乱。

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

  

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

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

答案 1 :(得分:2)

枚举值映射到的相应整数值始终从0开始,除非您专门更改值。

因此,您的第一段代码与此相同:

public enum MyEnum
{
    FirstValue = 0,
    SecondValue = 1,
    ThirdValue = 2,
    ForthValue = 1,
    FifthValue = 2
}

因此,您可以看到2个映射到ThirdValueFifthValue

你的第二个例子相当于:

public enum MyEnum
{
    FirstValue = 3,
    SecondValue = 4,
    ThirdValue = 5,
    ForthValue = 1,
    FifthValue = 2
}

答案 2 :(得分:0)

多个枚举器可以具有相同的值。如果您不想为每个枚举器指定值,只需切换定义枚举器的顺序:

public enum MyEnum
{
    FourthValue = 1,
    FifthValue,
    FirstValue,
    SecondValue,
    ThirdValue
}