列挙型変数のデフォルト値は何ですか?


240

列挙型変数、それが常に最初の要素にデフォルト設定されているかどうか誰でも知っていますか?


1
デフォルトの列挙型が望ましいユースケースの1つの考慮事項は、null許容変数を使用することです。nullが受信されると、コードの正しい部分でデフォルトに変換できます。このデフォルトは、残りのコード(nullを渡すだけ)で認識されている必要はありません。
ErikE 2016年

回答:


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

enumのどの要素もG対応しない場合0

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

default(G)文字どおり0に戻りますが、その型はそのままですG(上記のドキュメントで引用されているように、指定された列挙型へのキャスト)。


1
おかげで、intの代わりにcharで定義された列挙型はどうでしょうか。例enum Status {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ます。そのデフォルト値の周りに抽象化を作成する方法はありませんか?
クレイグシルバー

2
@Craig Silver:DefaultValue属性はプロパティに適用されます-列挙型は型であり、したがって、DefaultValueは列挙型全体には影響しません。私はあなたの種類の拡張メソッドでこれを回避できたと仮定していますが、より良いオフちょうど0のためにチェックしている
BoltClock

11

enumの値の順序に依存し、最初の値が常にデフォルトであると想定することは非常に危険だと思います。これは、デフォルト値の保護を懸念している場合に適しています。

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

それ以外の場合、必要なのは注文の不注意なリファクタリングだけであり、完全に異なるデフォルトがあります。


3
すみません、あなたは間違っています。私は同じことを想定してきましたが、あなたは入れた場合Fooの後Barの両方FooBar0の値を持つことになりますし、E.Foo == E.Bar返しますtrue。それはとても愚かで直観に反しますが、それは本当です:(
Pawcio
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.