默认为int,可以指定枚举成员的类型,只有int,uint,byte,sbyte,long,ulong,short,ushort这8种基元类型。
可以使用操作符作用于枚举类型,实际上是作用于相应的value实例字段,如++。
可以将枚举类型的实例显示转型为另一个不同的枚举类型,其实是先转为值,再反过去在另一个枚举中根据值找对应枚举值。
可以显示将枚举类型的实例转型为一个数值类型。
public
enum
Color
Black,
White
public
enum
Sentence
hello,
class
Program
static
void
Main(
string
[] args)
//
使用运算符,++
Color a
=
Color.Red;
++
a;
Sentence s;
//
两个不同的枚举相互转换, 但是发现Color.White值为2,相应在Sentence中找不到,所以直接返回整数2
s
=
(Sentence)Color.White;
//等价于(Sentence)1;
//
两个不同的枚举相互转换,返回枚举值Black
s
=
(Sentence)Color.Black;
//
直接输出White枚举值, 显式转为整数
Console.WriteLine(Color.White);
//
输出white
Console.WriteLine((Int32)Color.White);
//
输出2
如 enum Color{Red=1, White=2}对应IL:
可以看到,枚举只是一个在其中定义一系列常量字段和实例字段的结构。
如果只使用Color.Red这样的类型,则会作为常量处理,从而代码不再引用定义了的枚举类型,可以删除相应的dll(具体见第7章);
如果使用Color c = new Color();这样的语法,那么依赖于引用,不可以删除相应的dll
枚举方法列表:
1.GetUnderlyingType静态方法,获取枚举类型值的核心类型:
//
返回System.Int
Enum.GetUnderlyingType(
typeof
(Color));
2.ToString()方法
Color c
=
Color.Black;
Console.WriteLine(c);
//
输出Black
Console.WriteLine(c.ToString());
//
输出Black
Console.WriteLine(c.ToString(
"
G
"
));
//
输出Black,以上都是泛型格式
Console.WriteLine(c.ToString(
"
D
"
));
//
输出1,十进制
Console.WriteLine(c.ToString(
"
X
"
));
//
输出00000001,十六进制
对于c.ToString("X")十六进制格式,A-F始终是大写字母。此外,输出的数位个数取决于Color的基本类型:
byte/sbyte 2位
short/ushort 4位
int/uint 8位
long/ulong 16位
3.Format静态方法,功能基本同ToString()方法,但允许value传递一个数值,而不仅仅是一个Enum类型
Enum.Format(
typeof
(Color),
3
,
"
G
"
);
4.GetValues静态方法,返回一个数组,数组中为所有的枚举类型名称:
Color[] colors
=
(Color[])Enum.GetValues(
typeof
(Color));
5.static String GetName(Type enumType, Objbect value)静态方法,返回数值的字符串表示
6.static String[] GetNames(Type enumType),返回方法5的数组表示
7.Parse静态方法,将一个符号转换为枚举类型的一个实例:
Color cc1
=
(Color)Enum.Parse(
typeof
(Color),
"
2
"
);
Color cc2
=
(Color)Enum.Parse(
typeof
(Color),
"
Black
"
);
//
可以是值,也可以是枚举类型名称
Color cc3
=
(Color)Enum.Parse(
typeof
(Color),
"
Black
"
,
true
);
//
可选参数true表示忽略大小写
8.IsDefined静态方法,判断一个数值对于一个枚举类型是否合法:
Enum.IsDefined(
typeof
(Color),
10
);
//
返回false,Color中没有10
Enum.IsDefined(
typeof
(Color),
"
Black
"
);
//
返回true
常用于参数验证: