当前位置:  开发笔记 > 编程语言 > 正文

.NET:为什么没有检查Enum的范围/值?

如何解决《.NET:为什么没有检查Enum的范围/值?》经验,为你挑选了1个好方法。

这一直困扰着我.也许对.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值的整数进行逐位检查被认为太昂贵了.因此轻松转换为枚举值.



1> JaredPar..:

问题是表现.对于常规枚举(如Color),检查枚举非常简单

enum Color {
  Red,
  Blue
}

但问题是枚举用作位标志.

enum Property {
  IsFirst = 0x1,
  IsDefault = 0x2,
  IsLastAccessed = 0x4
}

必须对每个转换为Enum值的整数进行逐位检查被认为太昂贵了.因此轻松转换为枚举值.


那么为什么不创建一个修饰符或不同类型的枚举?像严格的枚举,或CheckedEnum,或类似的东西?对于99%的用户而言,性能不是问题......但允许具有虚假值的枚举是一个问题.
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有