在C#中将超出范围的数字转换为枚举不会产生exception

以下代码不会产生exception,而是将值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是否是允许的组合之一,如果使用标志枚举(可以或者一起使用的值),这可能很多。