gpt4 book ai didi

c# - int 到 enum 的转换无效

转载 作者:行者123 更新时间:2023-12-02 21:28:07 25 4
gpt4 key购买 nike

我正在测试我编写的一些代码,想知道是否需要默认情况处理。

让我们像这样定义 MyEnum

public enum MyEnum 
{
[Description("Value")]
Value = 0,
[Description("Other value")]
OtherValue = 1,
}

我问自己的逻辑与此类似:

MyEnum val = (MyEnum)8;
if(val == MyEnum.Value)
//do stuff
else if (val == MyEnum.OtherValue)
//do other stuff
else
throw new ArgumentException("The value is not currently supported");

我的理由是没有默认情况,因为从枚举中未定义的值进行转换无论如何都会在被我的代码捕获之前抛出异常。

所以我尝试了这里的例子,令我惊讶的是 Actor 没有抛出任何异常,而是我的默认案例处理女巫抛出了异常。

我的问题是:为什么任何 intMyEnum 的转换是有效的?我知道在这个例子中,Enum 的底层值是 int,但我预计会从强制转换中抛出异常。为什么这是有效的?

最佳答案

枚举只是一种处理底层数据类型值的奇特方式 - 默认情况下为Int32。你得到的是命名值,但失去了数学运算。没有规定只有声明中指定的值才是有效值,因此您不会遇到异常或编译器错误。

当您使用枚举作为标志时,这一点变得非常明显。

[Flags]
public enum Something
{
Foo = 1,
Bar = 2,
Baz = 4
}

现在是这样的

var x = Something.Foo | Something.Bar; // The value is 1 | 4 = 5

绝对没问题,你也可以拥有从未命名过的值。这一切都归结为您错误的假设,即允许的值集在某种程度上受到限制,并且正如引用规范的其他答案所指出的那样,情况并非如此。

关于c# - int 到 enum 的转换无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23017568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com