【发布时间】:2014-05-15 15:42:33
【问题描述】:
我有以下演员:
int myInteger = (int)myItem.EnumValue;
枚举在哪里:
public enum EnumValue
{
Yes= 0,
No = 1
}
从我的观察看来,当 myItem 上的 EnumValue 未设置时,EnumValue 的值默认设置为 Yes 并随后强制转换为 0。
为什么枚举不为空?我的观察正确吗?为什么会这样?
【问题讨论】:
我有以下演员:
int myInteger = (int)myItem.EnumValue;
枚举在哪里:
public enum EnumValue
{
Yes= 0,
No = 1
}
从我的观察看来,当 myItem 上的 EnumValue 未设置时,EnumValue 的值默认设置为 Yes 并随后强制转换为 0。
为什么枚举不为空?我的观察正确吗?为什么会这样?
【问题讨论】:
Enum 是值类型,所以就像int 和其他值类型一样,它们不能为空。相反,它们的默认值相当于 0(因为您已将 Yes 的枚举值分配给 0,所以在这种情况下这是默认值)。
如果您想要一个可为空的枚举,请使用 Nullable<EnumValue> 或简称 EnumValue?。
进一步阅读
【讨论】:
因为枚举变量本质上是枚举基础类型的变量。默认情况下它是整数。整数不能有空值。
更新:Under hood 枚举看起来像
class public auto ansi sealed EnumValue extends [mscorlib]System.Enum
{
.field public static literal EnumValue Yes = int32(0x00000000)
.field public static literal EnumValue No = int32(0x00000001)
.field public specialname rtspecialname int32 value__
}
即它是一组常量(在编译期间内联)和包含枚举值的整数(默认情况下)字段。这就是为什么您可以将任何整数值分配给EnumValue 类型的变量。这就是为什么默认情况下它的值为0。这就是为什么它不能是null。
【讨论】:
一些答案建议使用可为空的枚举,但您也可以在枚举中构建类似的逻辑,而无需 Nullable 类型的开销:
public enum EnumValue
{
Unknown = 0,
Yes = 1,
No = 2
}
由于枚举的默认值为0,所以默认值为Unknown。请注意,即使您没有定义值为零的字段,默认值也为零,如下所示:
public enum EnumValue
{
Yes = 1,
No = 2
}
【讨论】:
为什么枚举不为空?
因为enum是一个值类型,它永远不可能是null。
【讨论】:
枚举的基础类型始终是整数。来自the docs:
每个枚举类型都有一个底层类型,它可以是任何 除 char 以外的整型。枚举的默认基础类型 元素是int。
由于你的基于 int,枚举的默认值是整数的默认值 - 为零。
【讨论】: