为了账号安全,请及时绑定邮箱和手机立即绑定

为什么将int转换为无效的枚举值而不抛出异常?

为什么将int转换为无效的枚举值而不抛出异常?

C#
达令说 2019-08-19 10:55:42
为什么将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 conversionsC#语言规范说:

通过将任何参与的枚举类型视为该枚举类型的基础类型,然后在结果类型之间执行隐式或显式数字转换,处理两种类型之间的显式枚举转换。例如,给定枚举类型E with和基础类型int,从E到byte的转换作为显式数字转换(第6.2.1节)从int到byte处理,从byte到E的转换处理为从byte到int的隐式数值转换(第6.1.2节)。

基本上,在进行转换操作时,枚举被视为基础类型。默认情况下,枚举的基础类型是Int32,这意味着转换的处理方式与转换完全相同Int32。这意味着任何有效值int都是允许的。

我怀疑这主要是出于性能原因。通过制作enum简单的整数类型并允许任何整数类型转换,CLR不需要进行所有额外检查。这意味着enum与使用整数相比,使用a确实没有任何性能损失,这反过来又有助于鼓励使用它。


查看完整回答
反对 回复 2019-08-19
  • 3 回答
  • 0 关注
  • 844 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信