以下代码不会产生异常,而是将值4传递给tst。任何人都可以解释这背后的原因吗?
public enum testing
{
a = 1,
b = 2,
c = 3
}
testing tst = (testing)(4);
答案 0 :(得分:25)
在C#中,与Java不同,不检查枚举。您可以拥有基础类型的任何值。这就是检查输入非常重要的原因。
if(!Enum.IsDefined(typeof(MyEnum), value))
throw new ArgumentOutOfRangeException();
答案 1 :(得分:1)
由于你的枚举基于int,它可以接受int可以的任何值。既然你明确告诉编译器(通过强制转换)可以将4转换为你的枚举,那就可以了。
答案 2 :(得分:1)
每个枚举都有一个用于表示的基础数字类型(例如int)。即使某个值没有名称,它也是枚举可能具有的值。
答案 3 :(得分:1)
其他人没有说的:通过投射,你告诉编译器你知道你在做什么。所以,如果你告诉它,将其视为枚举值,它确实如此。其他海报指出为什么仍然允许这样做,因为C#编译器不允许很多坏事,即使你说你知道你在做什么。
如果不允许该值,那将非常糟糕,因为那时您无法将标志值保存为int。或者,有人必须检查int是否是允许的组合之一,如果使用标志枚举(可以或者一起使用的值),这可能会很多。