这一直困扰着我.也许对.NET内部有一些核心知识的人可以向我解释一下.
假设我按如下方式定义枚举:
public enum Foo { Eenie = 1, Meenie = 2, Miney = 3, Moe = 4 }
现在,也假设在我的代码中的某个地方,我有以下代码:
int bar = (Foo)5;
这将编译得很好,并且不会引发任何异常,即使值5显然不是在中定义的有效值Foo
.
或者,请考虑以下事项:
public void ProcessFoo(Foo theFoo) { // Do processing } public static void Main() { ProcessFoo((Foo)5); }
再次,也不例外.
在我看来,这应该导致类型不匹配异常,因为5不是a Foo
.但设计师选择不这样做.
现在,我已经编写了一个可以验证这种情况的扩展方法,并且调用它以确保就是这种情况并没有什么大不了的,但是我必须使用反射来做到这一点(包括所有性能损失和诸如此类的因素) ).
那么,有什么令人信服的理由可能导致决定没有检查枚举?
供参考,来自Enum类的MSDN文档:
定义将枚举常量作为值的方法或属性时,请考虑验证该值.原因是您可以将数值转换为枚举类型,即使该枚举类型中未定义该数值也是如此.
JaredPar.. 14
问题是表现.对于常规枚举(如Color),检查枚举非常简单
enum Color { Red, Blue }
但问题是枚举用作位标志.
enum Property { IsFirst = 0x1, IsDefault = 0x2, IsLastAccessed = 0x4 }
必须对每个转换为Enum值的整数进行逐位检查被认为太昂贵了.因此轻松转换为枚举值.
问题是表现.对于常规枚举(如Color),检查枚举非常简单
enum Color { Red, Blue }
但问题是枚举用作位标志.
enum Property { IsFirst = 0x1, IsDefault = 0x2, IsLastAccessed = 0x4 }
必须对每个转换为Enum值的整数进行逐位检查被认为太昂贵了.因此轻松转换为枚举值.