关于c#:如何将枚举设置为null

How to set enum to null

我有一个枚举

1
2
3
4
5
6
7
8
string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

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

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

编辑:我的错,我没解释清楚。但是所有与nullable相关的答案都是完美的。我的情况是,如果在具有其他元素(如名称等)的类中为枚举设置了get/set,我将在页面加载时初始化该类并尝试将值默认为空。这里是场景(代码在C中):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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类中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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; }
    }

}

谢谢大家的建议。


您可以使用"?"可为空类型的运算符。

1
public Color? myColor = null;

或者对枚举使用标准惯例,如果枚举中的第一个值(即0)是默认值,则不能为空。例如,在颜色为"无"的情况下。

1
public Color myColor = Color.None;


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

一般的选择是增加一个None成员:

1
2
3
4
5
6
7
8
9
public enum Color
{
  None,
  Red,
  Green,
  Yellow
}

Color color = Color.None;

…或使用Nullable

1
Color? color = null;


使变量可以为空。像:

1
Color? color = null;

1
Nullable<Color> color = null;

枚举是C中的"value"类型(表示枚举存储为任何值,而不是作为对存储值本身的内存中某个位置的引用)。不能将值类型设置为空(因为空仅用于引用类型)。

也就是说,您可以使用内置的Nullable类来包装值类型,这样您就可以将它们设置为空,检查它是否为HasValue,并获取它的实际Value。(这两种方法都是针对Nullable对象的。

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

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

1
Color? color = null;

Nullable相同;


我假设这里是C++。如果您使用的是C,答案可能是相同的,但是语法会有点不同。枚举是一组int值。它不是一个对象,所以您不应该将其设置为空。将某个值设置为空意味着您将指向对象的指针指向地址零。你不能真的用一个int来做这个。你想用一个int来做的是把它设置为一个你通常不会得到的值,这样你就可以知道它是否是一个好值。所以,把你的颜色设为-1

1
Color color = -1;

或者,可以从1开始枚举并将其设置为零。如果您将颜色设置为零,那么您将把它设置为"红色",因为红色在枚举中是零。

所以,

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