更新:2007 年 11 月
enum 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型。
通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它。但是,还可以将枚举嵌套在类或结构中。
默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。例如:
复制代码 | |
---|---|
enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; |
在此枚举中,Sat 为 0,Sun 为 1,Mon 为 2,依此类推。枚举数可以具有重写默认值的初始值设定项。例如:
复制代码 | |
---|---|
enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; |
在此枚举中,强制元素序列从 1 而不是 0 开始。但是,强烈建议枚举包含一个值为 0 的常量。有关更多信息,请参见枚举类型(C# 编程指南)。
每种枚举类型都有基础类型,该类型可以是除
复制代码 | |
---|---|
enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; |
准许使用的枚举类型有 byte、
可以给 Days 类型的变量赋以基础类型范围内的任何值,所赋的值不限于已命名的常数。
enum E 的默认值为表达式 (E)0 生成的值。
说明: |
---|
枚举数的名称中不能包含空白。 |
基础类型指定为每个枚举数分配的存储大小。但是,从 enum 类型到整型的转换需要用显式类型转换来完成。例如,下面的语句使用强制转换(从 enum 转换为 int)将枚举数 Sun 赋值给一个
复制代码 | |
---|---|
int x = (int)Days.Sun; |
将
可靠编程
与任何常量一样,对枚举中各个值的所有引用在编译时均将转换为数值文本。这可形成潜在的版本控制问题,如常量(C# 编程指南)中所述。
给新版本的枚举赋其他值,或者更改新版本中枚举成员的值,可导致相关源代码出现问题。通常在
如果其他开发人员将使用您的代码,您则需要提供相关说明,告诉开发人员如果任何 enum 类型中添加了新元素,他们的代码应该如何响应。
示例
在此例中,声明了一个枚举 Days。两个枚举数被显式转换为整数并赋给整型变量。
C# | 复制代码 |
---|---|
public class EnumTest { enum Days { Sun, Mon, Tue, Wed, Thu, Fri, Sat }; static void Main() { int x = (int)Days.Sun; int y = (int)Days.Fri; Console.WriteLine("Sun = {0}", x); Console.WriteLine("Fri = {0}", y); } } /* Output: Sun = 0 Fri = 5 */ |
在此例中,使用了基类选项来声明成员类型是 long 的 enum。请注意,即使枚举的基础类型是 long,也仍然必须使用强制转换将枚举成员显式转换为 long 类型。
C# | 复制代码 |
---|---|
public class EnumTest2 { enum Range : long { Max = 2147483648L, Min = 255L }; static void Main() { long x = (long)Range.Max; long y = (long)Range.Min; Console.WriteLine("Max = {0}", x); Console.WriteLine("Min = {0}", y); } } /* Output: Max = 2147483648 Min = 255 */ |
下面的代码示例阐释 enum 声明上的
C# | 复制代码 |
---|---|
[Flags] public enum CarOptions { SunRoof = 0x01, Spoiler = 0x02, FogLights = 0x04, TintedWindows = 0x08, } class FlagTest { static void Main() { CarOptions options = CarOptions.SunRoof | CarOptions.FogLights; Console.WriteLine(options); Console.WriteLine((int)options); } } /* Output: SunRoof, FogLights 5 */ |
注释
请注意,如果移除 FlagsAttribute,此示例的输出为:
5
5
C# 语言规范
有关更多信息,请参见 C# 语言规范中的以下各章节:
1.10 枚举
6.2.2 显式枚举转换
14 枚举