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

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

如果我有这样的枚举:

enum Beer{
    Bud = 10,
    Stella = 20,
    Unknown}

为什么在将int超出这些值的值转换为某种类型时不会抛出异常Beer

例如,以下代码不会抛出异常,它会向控制台输出“50”:

int i = 50;var b = (Beer) i;Console.WriteLine(b.ToString());

我觉得这很奇怪......任何人都可以澄清吗?


达令说
浏览 851回答 3
3回答

慕后森

简短的回答:语言设计者决定以这种方式设计语言。答案很长: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确实没有任何性能损失,这反过来又有助于鼓励使用它。
打开App,查看更多内容
随时随地看视频慕课网APP