枚举类型是一种独特的值类型,它用于声明一组命名的常数。
14.1枚举声明
枚举声明以关键字enum开始,然后定义枚举的名称、可访问性、基础类型和成员。
每个枚举类型都有一个对应的整型,称为该枚举类型的基础类型。此基础类型必须能表示该枚举中定义的所有枚举数值。枚举声明可以显式地声明byte、sbyte、short、ushort、int、uint、long或ulong类型作为基础类型,默认的枚举类型是int。比如:
声明一个基础类型为long的枚举。
14.2枚举修饰符
枚举声明的修饰符与类声明的修饰符具有相同的意义。枚举是不能抽象的,也不能是派生。
14.3枚举成员
任意的两个枚举成员不能具有相同的名称。
每个枚举成员均有相关联的常数值,此值得类型就是包含了它的枚举的基础类型,且这个值必须在基础类型的范围之内;多个枚举成员可以共享同一个关联值。比如:
上面的这两个枚举成员Blue和Max就具有相同的关联之。
一个枚举成员的关联值可以是隐式地,也可以是显式地。如果枚举成员的声明中具有常数表达式初始值设定项,则该值就是该枚举成员的关联值;如果没有初始值设定项,可以按照下面规则设置:
1.如果枚举成员是在枚举类型中声明的第一个枚举成员,则它的关联值是零;
2.否则,枚举成员的关联值是前一个枚举成员的关联值加1得到的,加之后的值必须在基础类型范围之内;否则会报错。
Red的值为0,Green的值是10,Blue的值是11。
除了循环性限制外,枚举成员初始值设定项可以自由地引用其他的枚举成员设定项,而不必考虑它们所在的文本位置的排列顺序。比如:
上面这个就是循环性,A和B声明是循环的,A显式依赖于B,而B隐式依赖于A。
枚举成员的命名方式和作用范围和类中的字段完全类似。枚举成员是不具有任何访问行声明的。
14.4System.Enum类型
System.Enum类型是所有枚举类型的抽象基类,它是一种与枚举类型的基础类型不同的独特类型,并且从System.Enum继承的成员在任何枚举类型都可以用;存在从任何枚举类型到System.Enum的装箱转换,同时从System.Enum到任何枚举类型的拆箱转换。
但System.Enum本身不是枚举类型,而实类类型,所有枚举类型都是从它派生;而System.Enum是从类型System.ValueType派生,System.ValueType是从object类型派生。
在运行时,类型System.Enum的值可以是null,也可以是对任何枚举类型的装箱的值的引用。
14.5枚举值和运算
每个枚举类型都定义了一个独特类型,需要使用显式枚举转化在枚举类型和整数之间或两个枚举类型之间进行转换;比如在枚举类型E中声明成员v,值就是(E)v。
枚举类型的值域不受它的枚举成员限制。详细说就是枚举的基础类型的任何一个值都可以被强制转换为该枚举类型。