枚举变量的默认值是多少?


240

一个枚举变量,有人知道它是否始终默认为第一个元素吗?


1
对于需要默认枚举的用例,一个考虑因素是使用可为空的变量。收到null时,可以在代码的正确部分将其转换为默认值,而在其余的代码中不必知道此默认值(只需传递一个null即可)。
ErikE

Answers:


381

枚举的任何成员代表值0。具体来说,从文档中

an的默认值enum E是表达式产生的值(E)0

例如,使用以下枚举:

enum E
{
    Foo, Bar, Baz, Quux
}

由于它是第一个出现的元素,因此在不覆盖默认值的情况下,打印default(E)返回Foo

然而,并不总是该情况0枚举的由第一构件表示。例如,如果您这样做:

enum F
{
    // Give each element a custom value
    Foo = 1, Bar = 2, Baz = 3, Quux = 0
}

印刷default(F)会给你Quux,而不是Foo

如果枚举中的任何元素都不G对应于0

enum G
{
    Foo = 1, Bar = 2, Baz = 3, Quux = 4
}

default(G)按字面值返回0,尽管其类型保持为G(如上面的文档所引用,强制转换为给定的枚举类型)。


1
谢谢,关于用char而不是int定义的枚举呢?例如,枚举状态{Active ='A',Inactive ='I'}
Fernando Torres

3
@Fernando托雷斯:仍然0,除非你的枚举值对应于一个'\0'default(char),这是因为极不可能default(char)是NUL字符对应于字符代码0
BoltClock

我(不正确吗?)假定使用DefaultValue属性(类似-之类的东西)System.ComponentModel.DefaultValue(MyEnum.Blah)会修改的行为,default(MyEnum)但仍会产生0。没有办法为enum默认值附近的对象创建抽象吗?
Craig Silver

2
@Craig Silver:DefaultValue属性适用于属性-枚举是一种类型,因此,DefaultValue对整个枚举类型没有影响。我想你可以解决这个与各种各样的扩展方法,但你最好还是先检查0
BoltClock

11

我认为依靠枚举中值的顺序并假设第一个始终是默认值是非常危险的。如果您担心保护默认值,那么这将是一个好习惯。

enum E
{
    Foo = 0, Bar, Baz, Quux
}

否则,只需要对订单进行粗心的重构,就可以得到完全不同的默认值。


3
对不起,你错了。我假设相同,但是如果您将两者都放在Foo后面,则其值为0并返回。它是如此愚蠢和违反直觉,但这是真的:(BarFooBarE.Foo == E.Bartrue
Pawcio
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.