如何将枚举设置为null


191

我有一个枚举

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方法一起使用。我只需要添加“?” 在声明私有枚举变量期间在EnumTest类中以及在get / set方法中:

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; }
    }

}

感谢所有可爱的建议。


Answers:


369

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

public Color? myColor = null;

或对不能为空的枚举使用标准做法,方法是将枚举中的FIRST值(aka 0)作为默认值。例如,在颜色为无的情况下。

public Color myColor = Color.None;

@equiman不需要强制转换,因为类型是在左侧指定的,您基本上是在复制已经接受的答案的第一部分。
Rodney S. Foley

7
这回答了我的问题:您可以添加“吗?” 枚举以使其可为空?
LuckyLikey 2015年

对于那些已经在其类中声明了可空类型并来到这里的用户:myColor =(Color?)null;
StefanJanssen

@StefanJanssen,如果myColor已声明为可空类型,则无需强制将其强制转换为myColor = null就可以了。
罗德尼·弗利

我不知道问题出在哪里,但是对于我的编译器,它确实给出了错误,直到执行强制转换为止。
StefanJanssen

43

如果这是C#,它将无法正常工作:枚举是值类型,不能是null

正常选项是添加None成员:

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

Color color = Color.None;

...或使用Nullable

Color? color = null;

24

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

Color? color = null;

要么

Nullable<Color> color = null;

9

枚举是C#中的“值”类型(表示该枚举存储为它的任何值,而不是引用该值本身在内存中的存储位置)。您不能将值类型设置为null(因为null仅用于引用类型)。

话虽如此,您可以使用Nullable<T>包装值类型的内置类,以便可以将它们设置为null,检查它是否HasValue为实Value。(这两种都是Nullable<T>对象上的方法。

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

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

Color? color = null;

那和Nullable<Color>;


3

我在这里假设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;

0

将值0显式分配给None 常量会更好吗?为什么?

因为默认enum值等于0,所以如果您调用default(Color)它,它将打印出来None

因为它在第一个位置,所以将字面值0分配给任何其他常量将更改该行为,并且更改出现的顺序将更改default(Color)https://stackoverflow.com/a/4967673/8611327)的输出


-2
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?(); 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.