以下代码不会产生异常,而是将值4传递给tst。任何人都可以解释这背后的原因吗?

 public enum testing
 { 
    a = 1,
    b = 2,
    c = 3
 }

testing tst = (testing)(4);
有帮助吗?

解决方案

在C#中,与Java不同,不检查枚举。您可以拥有基础类型的任何值。这就是检查输入非常重要的原因。

if(!Enum.IsDefined(typeof(MyEnum), value))
     throw new ArgumentOutOfRangeException();

其他提示

由于你的枚举基于int,它可以接受int可以的任何值。既然你明确告诉编译器(通过强制转换)可以将4转换为你的枚举,那就可以了。

每个枚举都有一个用于表示的基础数字类型(例如int)。即使某个值没有名称,它也是枚举可能具有的值。

其他人没有说的:通过投射,你告诉编译器你知道你在做什么。所以,如果你告诉它,将其视为枚举值,它确实如此。其他海报指出为什么仍然允许这样做,因为C#编译器不允许很多坏事,即使你说你知道你在做什么。

如果不允许该值,那将非常糟糕,因为那时您无法将标志值保存为int。或者,有人必须检查int是否是允许的组合之一,如果使用标志枚举(可以或者一起使用的值),这可能会很多。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top