【问题标题】:How to set enum to null如何将枚举设置为空
【发布时间】:2011-05-19 05:48:12
【问题描述】:

我有一个枚举

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

如何在加载时将其设置为 NULL。

name = "";
Color color = null; //error

编辑: 我的错,我没有正确解释。但是所有与 nullable 相关的答案都是完美的。我的情况是如果,我在一个类中使用其他元素(如名称等)获取/设置枚举。在页面加载时,我初始化类并尝试将值默认为 null。这是场景(代码在 C# 中):

namespace Testing
{
    public enum ValidColors
    {
        Red,
        Green,
        Yellow
    }

    public class EnumTest
    {
        private string name;
        private ValidColors myColor;

        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        public ValidColors MyColor
        {
            get { return myColor; }
            set { myColor = value; }
        }

    }

    public partial class _Default : System.Web.UI.Page
    {       
        protected void Page_Load(object sender, EventArgs e)
        {
            EnumTest oEnumTest = new EnumTest();
            oEnumTest.Name = "";
            oEnumTest.MyColor = null; //???
        }
    }

}

然后使用下面的建议,我更改了上面的代码以使其与 get 和 set 方法一起使用。我只需要添加“?”在声明私有枚举变量期间和在 get/set 方法中的 EnumTest 类中:

public class EnumTest
{
    private string name;
    private ValidColors? myColor; //added "?" here in declaration and in get/set method

    public string Name
    {
        get { return name; }
        set { name = value; }
    }

    public ValidColors? MyColor
    {
        get { return myColor; }
        set { myColor = value; }
    }

}

感谢所有可爱的建议。

【问题讨论】:

标签: c# enums null nullable


【解决方案1】:

您可以使用“?”可空类型的运算符。

public Color? myColor = null;

或者通过将枚举中的第一个值(又名 0)作为默认值来使用不能为空的枚举的标准做法。例如在颜色无的情况下。

public Color myColor = Color.None;

【讨论】:

  • @equiman 不需要转换,因为类型是在左侧指定的,您基本上是在复制我已经接受的答案的第一部分。
  • 这回答了我的问题:你能加'吗?'枚举以使其可以为空?
  • 对于那些已经在他们的班级中声明了可为空类型并来到这里的人:myColor = (Color?)null;
  • @StefanJanssen 如果它已经声明为可空类型 Color ,则不需要强制转换 null ,只需 myColor = null 即可。
  • 当时我不知道问题出在哪里,但是对于我的编译器来说,在我进行强制转换之前它确实给出了错误。
【解决方案2】:

如果这是 C#,它将不起作用:枚举是值类型,不能是 null

正常的选项是添加None 成员:

public enum Color
{
  None,
  Red,
  Green,
  Yellow
}

Color color = Color.None;

...或使用Nullable:

Color? color = null;

【讨论】:

    【解决方案3】:

    使您的变量可以为空。喜欢:

    Color? color = null;
    

    Nullable<Color> color = null;
    

    【讨论】:

      【解决方案4】:

      枚举是 C# 中的“值”类型(意味着枚举存储为任何值,而不是作为对存储值本身的内存位置的引用)。您不能将值类型设置为 null(因为 null 仅用于引用类型)。

      话虽如此,您可以使用内置的 Nullable&lt;T&gt; 类来包装值类型,以便您可以将它们设置为 null,检查它是否为 HasValue 并获取其实际的 Value。 (这些都是Nullable&lt;T&gt; 对象的方法。

      name = "";
      Nullable<Color> color = null; //This will work.
      

      您还可以使用一个快捷方式:

      Color? color = null;
      

      也就是Nullable&lt;Color&gt;;

      【讨论】:

        【解决方案5】:

        我在这里假设 C++。如果您使用的是 c#,答案可能是相同的,但语法会有所不同。 枚举是一组 int 值。它不是一个对象,所以你不应该将它设置为 null。将某些内容设置为 null 意味着您将指向对象的指针指向地址为零。你不能用int真正做到这一点。您想要对 int 执行的操作是将其设置为您通常不会使用的值,以便您可以判断它是否是一个好值。 因此,将颜色设置为 -1

        Color color = -1;
        

        或者,您可以从 1 开始枚举并将其设置为零。如果您现在将颜色设置为零,您会将其设置为“红色”,因为红色在您的枚举中为零。

        所以,

        enum Color {
        red =1
        blue,
        green
        }
        //red is 1, blue is 2, green is 3
        Color mycolour = 0;
        

        【讨论】:

          【解决方案6】:
          Color? color = null;
          

          或者你可以使用

          Color? color = new Color?();
          

          分配 null 不起作用的示例

          color = x == 5 ? Color.Red : x == 9 ? Color.Black : null ; 
          

          所以你可以使用:

           color = x == 5 ? Color.Red : x == 9 ? Color.Black : new Color?(); 
          

          【讨论】:

            【解决方案7】:

            将值 0 显式分配给 None 不是更好吗? 持续的?为什么?

            因为默认的enum 值等于0,如果你调用default(Color),它会打印None

            因为它在第一个位置,将文字值 0 分配给任何其他常量会改变这种行为,同时改变出现的顺序也会改变 default(Color) (https://stackoverflow.com/a/4967673/8611327) 的输出

            【讨论】:

              【解决方案8】:

              使用Nullable enum 作为类/方法变量和类属性时的一些观察和陷阱


              C# v7.3 中(在.NET v4.7.2VS2019 上测试),

              这行得通:

              Color? color = null; // works
              

              但这不是:

              Color? color = condition ? Color.Red : null;
              
              // Error CS8370 
              // Feature 'target-typed conditional expression' is not available in C# 7.3.  
              // Please use language version 9.0 or greater.
              

              解决方法是对null 进行类型转换:

              Color? color = condition ? Color.Red : (Color?)null; // works
              

              此外,将变量命名为Color,即与类型完全相同的大小写,仅在类型不可为空时起作用

              Color Color = condition ? Color.Red : Color.None; // works fine!
              

              但是当类型为Nullable时会失败

              Color? Color = condition ? Color.Red : (Color?)null;
              
              // Error CS0165 Use of unassigned local variable 'Color'
              // Error CS1061 'Color?' does not contain a definition for 'Red' 
              // and no accessible extension method 'Red' accepting a first argument of type 'Color?' 
              // could be found (are you missing a using directive or an assembly reference?)
              

              解决方法是在命名空间中使用类型的完全限定名称:

              Color? Color = condition ? MyEnums.Color.Red : (Color?)null; // works now
              

              但最好坚持变量小写命名的标准做法:

              Color? color = condition ? Color.Red : (Color?)null; // works now
              

              对于class-level 的属性可以看到类似的问题:

              class Program {
                  Color? Color => Condition ? Color.Red : (Color?)null;
              }
              
              // Error CS1061 'Color?' does not contain a definition for 'Red' 
              // and no accessible extension method 'Red' accepting a first argument of type 'Color?' 
              // could be found (are you missing a using directive or an assembly reference?)
              

              同样,解决方法是完全限定类型:

              Color? Color => Condition ? MyEnums.Color.Red : (Color?)null; // works now
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2010-11-09
                • 1970-01-01
                • 1970-01-01
                • 2016-06-27
                • 2013-09-08
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多