一、cs不支持Enum隐式转换为数字基础类型(比如int)
比如:
定义了如下枚举:
public enum TestEnum
{
TE_A = 1,
TE_B = 2,
}
和如下方法:
public int GetVal()
{
return TestEnum.TE_A;
}
编译时会提示如下异常:
error CS0266: Cannot implicitly convert type `TestEnum' to `int'. An explicit conversion exists (are you missing a cast?)
解决方案:
(1)借助Convert.ToInt32做类型转换。
public int GetVal()
{
return Convert.ToInt32(TestEnum.TE_A);
}
(2)显式类型转换。
public int GetVal()
{
return (int)TestEnum.TE_A;
}
 
二、cs不支持数值基础类型隐式转枚举类型
依旧拿上面的枚举TestEnum说例,定义如下方法:
public TestEnum GetEnum()
{
return 1;
}
编译时会提示如下异常:
error CS0266: Cannot implicitly convert type `int' to `TestEnum'. An explicit conversion exists (are you missing a cast?)
解决方案:
(1)借助Enum.ToObject()
public TestEnum GetEnum()
{
var param = Convert.ToInt64(1);
return (TestEnum)Enum.ToObject(typeof(TestEnum), param);
}
(2)显式强制类型转换。
 
三、Enum.ToObject说明
参数:
第一个参数为需要转换成的枚举类型。
第二个参数为需要转换的数值。
使用时注意如下情况:
(1)目标类型不是枚举时,编译是不会提示任何异常。可通过Type.IsEnum()来判断
(2)目标枚举类型并不包含该值时,编译不会提示异常,运行时转换成功后所获得的值可正常使用。
类似的接口还有Enum.Parse()
 
四、枚举的使用情景
个人认为,枚举的使用情景终归以下两种:
一、元素使用的情景间是互斥,例如某枚举序列表示星期,序列的使用情景为标记某个时刻,指定时刻里不可能既是星期一又是星期二;
二、存在某情景多个元素并存,例如某枚举序列表示麻痹和眩晕等角色异常,序列的使用情景为标记某个时刻角色的状态,指定时刻角色是可以既触发麻痹又触发眩晕的。
 
基于上述情景二,我们会给枚举加上[Flags]特性(也可以是[FlagsAttribute],两者是同一个东西)来标记为它是位域。非Flags枚举也是可直接进行位操作的。
注意:当枚举用作位域时,元素的值应向位操作做合理的考虑。
 
参考: