为什么将int转换为无效的枚举值而不抛出异常?如果我有这样的枚举:enum Beer{
Bud = 10,
Stella = 20,
Unknown}为什么在将int超出这些值的值转换为某种类型时不会抛出异常Beer?例如,以下代码不会抛出异常,它会向控制台输出“50”:int i = 50;var b = (Beer) i;Console.WriteLine(b.ToString());我觉得这很奇怪......任何人都可以澄清吗?
3 回答
慕后森
TA贡献1802条经验 获得超5个赞
简短的回答:语言设计者决定以这种方式设计语言。
答案很长:Section 6.2.2: Explicit enumeration conversions
C#语言规范说:
通过将任何参与的枚举类型视为该枚举类型的基础类型,然后在结果类型之间执行隐式或显式数字转换,处理两种类型之间的显式枚举转换。例如,给定枚举类型E with和基础类型int,从E到byte的转换作为显式数字转换(第6.2.1节)从int到byte处理,从byte到E的转换处理为从byte到int的隐式数值转换(第6.1.2节)。
基本上,在进行转换操作时,枚举被视为基础类型。默认情况下,枚举的基础类型是Int32
,这意味着转换的处理方式与转换完全相同Int32
。这意味着任何有效值int
都是允许的。
我怀疑这主要是出于性能原因。通过制作enum
简单的整数类型并允许任何整数类型转换,CLR不需要进行所有额外检查。这意味着enum
与使用整数相比,使用a确实没有任何性能损失,这反过来又有助于鼓励使用它。
- 3 回答
- 0 关注
- 886 浏览
添加回答
举报
0/150
提交
取消