ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# enum(C# 参考) **enum** 关键字用于声明枚举,即一种由一组称为枚举数列表的命名常量组成的独特类型。 通常情况下,最好是在命名空间内直接定义枚举,以便该命名空间中的所有类都能够同样方便地访问它。但是,还可以将枚举嵌套在类或结构中。 默认情况下,第一个枚举数的值为 0,后面每个枚举数的值依次递增 1。例如,下面的枚举,Sat 是 0,Sun 是 1,Mon 是 2 等. ``` enum Days {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; ``` 如下面的示例所示枚举数可用初始值来重写默认值。 ``` enum Days {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; ``` 在此枚举中,强制元素序列从 1 而不是 0 开始。但是,一般建议包括值为 0 的常量。有关更多信息,请参见 [枚举类型(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/cc138362.aspx)。 每种枚举类型都有基础类型,该类型可以是除 [char](https://msdn.microsoft.com/zh-CN/library/x9h8tsay.aspx) 以外的任何整型。枚举元素的默认基础类型为 [int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx)。要声明另一整型枚举(如 [byte](https://msdn.microsoft.com/zh-CN/library/5bdb6693.aspx)),请在标识符之后紧跟类型,然后再使用冒号,如下面的示例所示。 ``` enum Days : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri}; ``` 准许使用的枚举类型有 **byte**、[sbyte](https://msdn.microsoft.com/zh-CN/library/d86he86x.aspx)、[short](https://msdn.microsoft.com/zh-CN/library/ybs77ex4.aspx)、[ushort](https://msdn.microsoft.com/zh-CN/library/cbf1574z.aspx)、[int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx)、[uint](https://msdn.microsoft.com/zh-CN/library/x0sksh43.aspx)、[long](https://msdn.microsoft.com/zh-CN/library/ctetwysk.aspx) 或 [ulong](https://msdn.microsoft.com/zh-CN/library/t98873t4.aspx)。 可以给 Days 类型的变量赋以基础类型范围内的任何值,所赋的值不限于已命名的常数。 enum E 的默认值为表达式 (E)0 生成的值。 | ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 | | :-- | | 枚举数的名称中不能包含空白。 | 基础类型指定为每个枚举数分配的存储大小。但是,从 **enum** 类型到整型的转换需要用显式类型转换来完成。例如,下面的语句使用强制转换(从 **enum** 转换为 **int**)将枚举数 Sun 赋值给一个 [int](https://msdn.microsoft.com/zh-CN/library/5kzh1b5w.aspx) 类型的变量。 ``` int x = (int)Days.Sun; ``` 将 [System.FlagsAttribute](https://msdn.microsoft.com/zh-CN/library/system.flagsattribute.aspx) 应用于某个枚举时,如果该枚举包含一些使用按位 **OR** 运算组合的元素,该特性在用于某些工具时会影响 **enum** 的行为。当使用诸如 [Console](https://msdn.microsoft.com/zh-CN/library/system.console.aspx) 类方法、表达式计算器这样的工具时,可以注意到这些变化。(请参见第三个示例。) ## 可靠编程 与任何常量一样,对枚举中各个值的所有引用在编译时均将转换为数值文本。这可形成潜在的版本控制问题,如[常量(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/ms173119.aspx)中所述。 给新版本的枚举赋其他值,或者更改新版本中枚举成员的值,可导致相关源代码出现问题。通常在 [switch](https://msdn.microsoft.com/zh-CN/library/06tc147t.aspx) 语句中使用枚举值。如果 **enum** 类型中添加了其他元素,则 switch 语句的默认节可能被意外选定。 如果其他开发人员使用您的代码,则需要提供相关说明,告诉开发人员如果任何 **enum** 类型中添加了新元素,他们的代码应该如何响应。 在下面的示例中,将声明枚举 Days。两个枚举数被显式转换为整数并赋给整型变量。 ``` 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** 类型。 ``` 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** 声明上的 [System.FlagsAttribute](https://msdn.microsoft.com/zh-CN/library/system.flagsattribute.aspx) 特性的使用和效果。 ``` // Add the attribute Flags or FlagsAttribute. [Flags] public enum CarOptions { // The flag for SunRoof is 0001. SunRoof = 0x01, // The flag for Spoiler is 0010. Spoiler = 0x02, // The flag for FogLights is 0100. FogLights = 0x04, // The flag for TintedWindows is 1000. TintedWindows = 0x08, } class FlagTest { static void Main() { // The bitwise OR of 0001 and 0100 is 0101. CarOptions options = CarOptions.SunRoof | CarOptions.FogLights; // Because the Flags attribute is specified, Console.WriteLine displays // the name of each enum element that corresponds to a flag that has // the value 1 in variable options. Console.WriteLine(options); // The integer value of 0101 is 5. Console.WriteLine((int)options); } } /* Output: SunRoof, FogLights 5 */ ``` ## 注释 如果您移除 **Flags**,则示例将显示以下值: 5 5 ## C# 语言规范 有关详细信息,请参阅 [C# 语言规范](https://msdn.microsoft.com/zh-CN/library/ms228593.aspx)。该语言规范是 C# 语法和用法的权威资料。 ## 请参阅 [C# 参考](https://msdn.microsoft.com/zh-CN/library/618ayhy6.aspx) [枚举类型(C# 编程指南)](https://msdn.microsoft.com/zh-CN/library/cc138362.aspx) [C# 关键字](https://msdn.microsoft.com/zh-CN/library/x53a06bb.aspx) [整型表(C# 参考)](https://msdn.microsoft.com/zh-CN/library/exx3b86w.aspx) [内置类型表(C# 参考)](https://msdn.microsoft.com/zh-CN/library/ya5y69ds.aspx) [隐式数值转换表(C# 参考)](https://msdn.microsoft.com/zh-CN/library/y5b434w4.aspx) [显式数值转换表(C# 参考)](https://msdn.microsoft.com/zh-CN/library/yht2cx7b.aspx)