【发布时间】:2009-01-11 13:38:37
【问题描述】:
这一直困扰着我。也许对 .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 不是Foo。但设计师选择不这样做。
现在,我编写了一个扩展方法,可以验证是否是这种情况,调用它来确保是这种情况并没有什么大不了的,但我必须使用反射来做到这一点(以及它的所有性能处罚之类的)。
同样,有什么令人信服的理由可能促使决定不检查枚举?
供参考,来自the MSDN documentation for the Enum class:
当你定义一个方法或属性时 将枚举常量作为 值,请考虑验证该值。 原因是你可以施放一个 枚举类型的数值 即使那个数值不是 在枚举中定义。
【问题讨论】:
-
我不想在这里发动一场圣战,但这就是我更喜欢Java枚举的原因:在Java中,枚举类型是特殊的类,枚举值是对象而不是具有特殊含义的整数.这意味着您甚至不能将无效值传递给需要枚举(null 除外)的方法