未设置enum时会发生什么?

本文关键字:什么 设置 enum | 更新日期: 2023-09-27 18:03:38

我有以下cast:

int myInteger = (int)myItem.EnumValue;

枚举为:

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

从我的观察看来,当myItem上的EnumValue未设置时,EnumValue的值默认设置为Yes,随后转换为0。

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

未设置enum时会发生什么?

Enum 's是值类型,所以就像int 's和其他值类型一样,它们不能为空。相反,它们的默认值相当于0(因为您已经将枚举值Yes分配给0,这是本例中的默认值)。

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

进一步阅读

  • 值类型(c#参考)
  • enum (c# Reference)
  • 空类型(c#编程指南)

因为enum变量本质上是enum底层类型的变量。缺省为整型。整型不能为空值。

更新:Under hood enum看起来像

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 enum,但是您也可以在枚举中构建类似的逻辑,而不需要nullable类型的开销:

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

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

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

为什么enum不为空?

因为enum是一个值类型,不可能是null

枚举的基础类型始终是整型。来自文档:

每个枚举类型都有一个基础类型,可以是any除char以外的整型。枚举的默认基础类型Elements是int类型。

因为你的是基于int的,所以enum的默认值是一个整数的默认值——即0。