如何将枚举设置为null

时间:2010-12-02 16:20:35

标签: c# enums null nullable

我有一个枚举

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

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

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

编辑: 我的坏,我没有正确解释。但所有与可空的相关的答案都是完美的。我的情况是如果,我已经在类中使用其他元素(例如名称等)获取/设置枚举。在页面加载时,我初始化类并尝试将值默认为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; }
    }

}

感谢所有可爱的建议。

7 个答案:

答案 0 :(得分:318)

你可以使用“?”可操作类型的运算符。

public Color? myColor = null;

或者通过使枚举(即0)中的FIRST值成为默认值,使用不能为null的枚举的标准做法。例如,在颜色为无的情况下。

public Color myColor = Color.None;

答案 1 :(得分:39)

如果这是C#,它将无效:枚举是值类型,不能是null

正常选项是添加None成员:

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

Color color = Color.None;

...或使用Nullable

Color? color = null;

答案 2 :(得分:18)

让你的变量可以为空。像:

Color? color = null;

Nullable<Color> color = null;

答案 3 :(得分:8)

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

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

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

您还可以使用快捷方式:

Color? color = null;

这与Nullable<Color>;

相同

答案 4 :(得分:4)

我在这里假设c ++。如果你正在使用c#,答案可能是相同的,但语法会有所不同。  枚举是一组int值。它不是一个对象,所以你不应该将它设置为null。将something设置为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;

答案 5 :(得分:0)

  

将值0明确分配给None会不会更好   不变?为什么?

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

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

答案 6 :(得分:-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?();