我有一个enum

string name;

public enum Color
{
  Red,
  Green,
  Yellow
}

如何将它设置为NULL加载。

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

编辑: 我的错,我没有解释清楚。但所有与nullable相关的答案都是完美的。我的情况是什么,如果,我有获得/设置enum类中的其他元素,如名称等。在页面加载,我初始化类,并尝试默认值为空。下面是场景(代码是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; }
    }

}

谢谢大家的建议。


使你的变量为空。如:

Color? color = null;

or

Nullable<Color> color = null;

您可以对可空类型使用“?”操作符。

public Color? myColor = null;

或者使用不能为空的枚举的标准实践,将枚举中的FIRST值(即0)作为默认值。例如,在颜色的情况下。

public Color myColor = Color.None;

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

也就是说,你可以使用内置的Nullable<T>类,它包装值类型,这样你就可以将它们设置为null,检查它是否HasValue并获得它的实际值。(这些都是Nullable<T>对象上的方法。

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

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

Color? color = null;

这与Nullable<Color>相同;


如果这是c#,它将不起作用:enum是值类型,不能为空。

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

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

Color color = Color.None;

...或者使用Nullable:

Color? color = null;

这里我假设是c++。如果你使用c#,答案可能是一样的,但语法会有一点不同。 enum是一组int值。它不是一个对象,所以你不应该把它设为null。将某个对象设置为null意味着您将指向对象的指针指向零地址。int型不能这么做。你想要做的是将它设置为一个你通常不会拥有它的值,这样你就可以判断它是否是一个好值。 所以,将颜色设置为-1

Color color = -1;

或者,您可以从1开始枚举,并将其设置为0。如果你将颜色设置为0,就像现在一样,你将把它设置为“红色”,因为红色在你的枚举中是零。

So,

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

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?(); 

显式地将值0赋值为None不是更好吗 常量?为什么?

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

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


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


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

如此:

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,即与类型完全相同的情况,仅当类型是非nullable时才有效:

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

它是这样做的

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

  Color colors = Colors.null;