14.2 设置枚举的底层数据类型

每个枚举成员均具有相关联的常数值。此值的类型就是枚举的底层数据类型(underlying type)。每个枚举成员的常数值必须在该枚举的底层数据类型的范围之内(例如,当底层数据类型为uint的时候,不能让枚举成员的值为负数)。该类型可以是除了char类型之外的整数类型,如byte、sbyte、short、ushort、int、uint、long或者ulong。如果没有明确指定底层数据类型,则默认的数据类型是int类型。在代码清单14-1中,我们没有为枚举显式指定底层数据类型,其默认底层数据类型就是int类型。当然,也可以显式地指定底层数据类型为int型。要显式指定底层数据类型很简单,只需在声明枚举的时候在枚举名称后面加一个冒号,冒号后则为指定的底层数据类型。因此,代码清单14-1和代码清单14-4是等价的。

代码清单14-4 显式指定底层数据类型为int型


enum Week:int//底层数据类型

{

Monday,

Tuesday,

Wedesday,

Thursday,

Friday,

Saturday,

Sunday

};


同理,如果要显式指定为long型就非常简单了,接下来的示例代码,其目标就是将代码清单14-1中的枚举类型变更为long型,如代码清单14-5所示。

代码清单14-5 为枚举指定枚举类型


enum Week:long//指定底层数据类型为long

{

Monday,

Tuesday,

Wedesday,

Thursday,

Friday,

Saturday,

Sunday

};


此时,再次编译,然后观察生成的CIL代码,验证底层数据类型是否变为了long型(int64),这里以Monday枚举成员声明的CIL代码为例,从代码可知,底层数据类型已经为long类型,如代码清单14-6所示。

代码清单14-6 底层数据类型为long时的部分CIL代码


.field public static literal valuetype ProgrammingCSharp4.Week Monday=int64(0x0)