【问题标题】:What happens with enum when it is not set?未设置枚举时会发生什么?
【发布时间】:2014-05-15 15:42:33
【问题描述】:

我有以下演员:

int myInteger = (int)myItem.EnumValue;

枚举在哪里:

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

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

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

【问题讨论】:

    标签: c# casting enums


    【解决方案1】:

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

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

    进一步阅读

    【讨论】:

      【解决方案2】:

      因为枚举变量本质上是枚举基础类型的变量。默认情况下它是整数。整数不能有空值。

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

      【讨论】:

        【解决方案3】:

        一些答案​​建议使用可为空的枚举,但您也可以在枚举中构建类似的逻辑,而无需 Nullable 类型的开销:

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

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

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

        【讨论】:

          【解决方案4】:

          为什么枚举不为空?

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

          【讨论】:

            【解决方案5】:

            枚举的基础类型始终是整数。来自the docs

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

            由于你的基于 int,枚举的默认值是整数的默认值 - 为零。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-12-25
              • 2018-10-25
              • 2016-10-10
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多