C# 仅为某些成员使用指定值的枚举

C# 仅为某些成员使用指定值的枚举,c#,enums,C#,Enums,我有一个enum,它只对列表的一部分具有自定义值 public enum MyEnum { FirstValue, SecondValue, ThirdValue, ForthValue = 1, FifthValue = 2 } 当我尝试strina name=(MyEnum)2名称是第三个值 但是当我将enum更改为 public enum MyEnum { FirstValue = 3, SecondValue, Third

我有一个
enum
,它只对列表的一部分具有自定义值

public enum MyEnum
{
    FirstValue,
    SecondValue,
    ThirdValue,
    ForthValue = 1,
    FifthValue = 2
}
当我尝试
strina name=(MyEnum)2名称是
第三个值

但是当我将
enum
更改为

public enum MyEnum
{
    FirstValue = 3,
    SecondValue,
    ThirdValue,
    ForthValue = 1,
    FifthValue = 2
}
strina name=(MyEnum)2中名称为
FifthValue

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


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

除非您特别更改值,否则枚举值映射到的相应整数值始终从0开始

因此,您的第一段代码相当于:

public enum MyEnum
{
    FirstValue = 0,
    SecondValue = 1,
    ThirdValue = 2,
    ForthValue = 1,
    FifthValue = 2
}
public enum MyEnum
{
    FirstValue = 3,
    SecondValue = 4,
    ThirdValue = 5,
    ForthValue = 1,
    FifthValue = 2
}
因此您可以看到2同时映射到
ThirdValue
FifthValue

您的第二个示例与此等效:

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

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

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

public enum MyEnum
{
    FirstValue,    // == 0
    SecondValue,   // == 1
    ThirdValue,    // == 2
    ForthValue = 1,
    FifthValue = 2
}
因此,您有两个成员,其值为
2

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

C#标准说(我的重点):

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

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

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

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

初始示例中的值为0、1、2、1、2。
ThirdValue
FifthValue
都对应于整数值2,因此,调试器只是为您选取其中一个值。我正在考虑这个问题,并想知道如果您将一个具有最大值(默认情况下,枚举值的基础类型为int)的项放在一个没有指定数字的项后面,会发生什么情况-您会得到:“枚举器值太大,无法容纳其类型”。