枚举未设置时会发生什么?

时间:2014-05-15 15:42:34

标签: c# casting enums

我有以下演员:

int myInteger = (int)myItem.EnumValue;

枚举是:

public enum EnumValue
{
     Yes= 0,
     No = 1
}

根据我的观察,似乎当未设置myItem上的EnumValue时,EnumValue的值默认设置为Yes,然后转换为0.

为什么枚举不为空?我的观察是否正确,为什么会这样?

5 个答案:

答案 0 :(得分:9)

Enum是值类型,因此就像int和其他值类型一样,它们不能为空。相反,它们的默认值相当于0(因为您已将枚举值Yes指定为0,这是本例中的默认值)。

如果您想要一个可以为空的枚举,请简要使用Nullable<EnumValue>EnumValue?

进一步阅读

答案 1 :(得分:2)

因为enum变量本质上是enum底层类型的变量。默认情况下,它是整数。整数不能为空值。

更新: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

答案 2 :(得分:2)

有几个答案建议使用可以为空的枚举,但你也可以在你的枚举中构建类似的逻辑而不需要Nullable类型的开销:

public enum EnumValue
{
     Unknown = 0,
     Yes = 1,
     No = 2
}

由于枚举的默认值为0,因此默认值为Unknown。请注意,即使您没有定义值为零的字段,默认值也为零,如下所示:

public enum EnumValue
{
     Yes = 1,
     No = 2
}

答案 3 :(得分:1)

  

为什么枚举不为空?

因为enum是值类型,永远不会是null

答案 4 :(得分:1)

枚举的基础类型总是不可或缺的。来自the docs

  

每个枚举类型都有一个基础类型,可以是任何类型   整数类型除了char。默认的基础类型的枚举   元素是int。

由于你的是基于int的,因此enum的默认值是整数的默认值 - 即零。