如何将枚举设置为空
我有一个枚举
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; }
}
}
感谢所有人的可爱建议。
I have an enum
string name;
public enum Color
{
Red,
Green,
Yellow
}
How to set it to NULL on load.
name = "";
Color color = null; //error
Edited:
My bad, I didn't explain it properly. But all the answers related to nullable is perfect. My situation is What if, I have get/set for the enum in a class with other elements like name, etc. On page load I initiallize the class and try to default the values to null. Here is the scenario (Code is in 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; //???
}
}
}
Then using the suggestions below I changed the above code to make it work with get and set methods. I just need to add "?" in EnumTest class during declaration of private enum variable and in get/set method:
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; }
}
}
Thanks all for the lovely suggestions.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
您可以使用“?”可空类型的运算符。
或者使用枚举的标准做法,将枚举中的第一个值(也称为 0)作为默认值,从而不能为空。例如,在颜色无的情况下。
You can either use the "?" operator for a nullable type.
Or use the standard practice for enums that cannot be null by having the FIRST value in the enum (aka 0) be the default value. For example in a case of color None.
如果这是 C#,它将不起作用:枚举是值类型,并且不能为
null
。正常的选项是添加
None
成员:...或使用
Nullable
:If this is C#, it won't work: enums are value types, and can't be
null
.The normal options are to add a
None
member:...or to use
Nullable
:让你的变量可以为空。喜欢:
或
Make your variable nullable. Like:
or
枚举是 C# 中的“值”类型(意味着枚举存储为任何值,而不是存储值本身的内存位置的引用)。您不能将值类型设置为 null(因为 null 仅用于引用类型)。
也就是说,您可以使用内置的
Nullable
类来包装值类型,以便您可以将它们设置为 null,检查它是否HasValue
并获取其实际的 <代码>值。 (这些都是Nullable
对象上的方法。您还可以使用一个快捷方式:
与
Nullable
相同;An enum is a "value" type in C# (means the the enum is stored as whatever value it is, not as a reference to a place in memory where the value itself is stored). You can't set value types to null (since null is used for reference types only).
That being said you can use the built in
Nullable<T>
class which wraps value types such that you can set them to null, check if itHasValue
and get its actualValue
. (Those are both methods on theNullable<T>
objects.There is also a shortcut you can use:
That is the same as
Nullable<Color>
;使用
Nullable
enum
作为类/方法变量和类属性时的一些观察和陷阱:在
C# v7.3 (在
.NET v4.7.2
和VS2019
上测试),这有效:
但这不起作用:
修复方法是类型转换
null:
此外,命名变量
Color
,即与类型完全相同的情况,仅当类型不可为 Nullable 时才有效:但是在以下情况下会严重失败类型可为 Nullable :
解决方法是使用带有命名空间的类型的完全限定名称:
但最好坚持变量小写命名的标准做法:
对于
class
级别的属性可以看到类似的问题:同样,修复方法是完全限定类型:
Some observations and gotchas when working with
Nullable
enum
as class/method variables, and class properties:In
C# v7.3
(tested on.NET v4.7.2
withVS2019
),this works:
but this doesn't:
The fix is to type-cast
null
:Furthermore, naming the variable
Color
, i.e. exactly the same case as the type, works only when the type is non-Nullable:But fails miserably when the type is
Nullable
:The fix is to use the fully-qualified name of the type with the namespace:
But it is best to stick to standard practice of lower-case naming for the variable:
A similar problem can be seen for a property at
class
-level:Again, the fix is to fully-qualify the type:
我假设这里是c++。如果您使用 C#,答案可能是相同的,但语法会有点不同。
枚举是一组 int 值。它不是一个对象,因此您不应将其设置为 null。将某些内容设置为 null 意味着您将指向对象的指针指向零地址。你不能用 int 来做到这一点。您想要对 int 执行的操作是将其设置为您通常不会使用的值,以便您可以判断它是否是一个好的值。
因此,将颜色设置为 -1
或者,您可以从 1 开始枚举并将其设置为零。如果您将颜色设置为零,就像现在一样,您将把它设置为“红色”,因为红色在您的枚举中为零。
所以,
I'm assuming c++ here. If you're using c#, the answer is probably the same, but the syntax will be a bit different.
The enum is a set of int values. It's not an object, so you shouldn't be setting it to null. Setting something to null means you are pointing a pointer to an object to address zero. You can't really do that with an int. What you want to do with an int is to set it to a value you wouldn't normally have it at so that you can tel if it's a good value or not.
So, set your colour to -1
Or, you can start your enum at 1 and set it to zero. If you set the colour to zero as it is right now, you will be setting it to "red" because red is zero in your enum.
So,
或者您可以使用
分配 null 不起作用的示例,
因此您可以使用:
or you can use
example where assigning null wont work
so you can use :
因为默认的
enum
值等于0,如果您调用default(Color)
,它将打印None
。因为它位于第一个位置,所以将文字值 0 分配给任何其他常量都会更改该行为,并且更改出现顺序也会更改
default(Color)
的输出 (https://stackoverflow.com/a/4967673/8611327)Because default
enum
value is equal to 0, if You would calldefault(Color)
it would printNone
.Because it is at first position, assigning literal value 0 to any other constant would change that behaviour, also changing order of occurrence would change output of
default(Color)
(https://stackoverflow.com/a/4967673/8611327)样品是这样完成的
It is done so sample like this