仅为某些成员指定值的枚举

本文关键字:枚举 成员 | 更新日期: 2023-09-27 18:33:10

>我有一个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没有任何错误?

仅为某些成员指定值的枚举

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

编译器正在执行的第一个示例是:

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

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

要么给他们所有值,要么不给他们任何值。其他任何事情都可能导致混乱。

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

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

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

值映射到始终从 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
}

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

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