Apa nilai default untuk variabel enum?

241

Variabel enum, ada yang tahu jika selalu default ke elemen pertama?

pengguna496949
sumber
1
Satu pertimbangan untuk use case di mana enum default diinginkan adalah untuk menggunakan variabel nullable. Ketika sebuah null diterima, itu dapat diterjemahkan di bagian kode yang benar ke dalam default, dan default ini tidak harus diketahui di sisa kode (yang hanya meneruskan sebuah null).
ErikE

Jawaban:

382

Ini adalah anggota enumerasi yang mewakili nilai 0. Secara khusus, dari dokumentasi :

Nilai default suatu enum Eadalah nilai yang dihasilkan oleh ekspresi (E)0.

Sebagai contoh, ambil enum berikut:

enum E
{
    Foo, Bar, Baz, Quux
}

Tanpa mengesampingkan nilai default, pencetakan akan default(E)kembali Fookarena merupakan elemen pertama yang muncul.

Namun, tidak selalu demikian bahwa 0enum diwakili oleh anggota pertama. Misalnya, jika Anda melakukan ini:

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

Pencetakan default(F)akan memberi Anda Quux, bukan Foo.

Jika tidak ada elemen dalam enum yang Gbersesuaian dengan 0:

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

default(G)mengembalikan secara harfiah 0, meskipun jenisnya tetap seperti G(seperti dikutip oleh dokumen di atas, pemeran untuk jenis enum yang diberikan).

BoltClock
sumber
1
Terima kasih, dan bagaimana dengan enum yang didefinisikan dengan char, bukan int. mis. enum Status {Active = 'A', Inactive = 'I'}
Fernando Torres
3
@Fernando Torres: Masih 0, kecuali salah satu dari nilai enum Anda sesuai dengan '\0'atau default(char), yang sangat tidak mungkin karena default(char)adalah karakter NUL yang sesuai dengan kode char 0.
BoltClock
Saya (salah?) Berasumsi bahwa menggunakan DefaultValueatribut - sesuatu seperti - System.ComponentModel.DefaultValue(MyEnum.Blah)akan mengubah perilaku default(MyEnum)tetapi masih menghasilkan 0. Apakah tidak ada cara untuk membuat abstraksi untuk enumsekitar nilai defaultnya?
Craig Silver
2
@Craig Silver: Atribut DefaultValue berlaku untuk properti - enum adalah tipe dan karenanya, DefaultValue tidak berpengaruh pada tipe enum secara keseluruhan. Saya kira Anda bisa mengatasi ini dengan metode ekstensi macam, tapi Anda lebih baik hanya memeriksa 0.
BoltClock
11

Saya pikir cukup berbahaya untuk mengandalkan urutan nilai-nilai dalam enum dan mengasumsikan bahwa yang pertama selalu default. Ini akan menjadi praktik yang baik jika Anda khawatir tentang melindungi nilai default.

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

Jika tidak, yang diperlukan hanyalah refactor yang ceroboh dari pesanan dan Anda memiliki standar yang sama sekali berbeda.

pengguna3154431
sumber
3
Maaf kamu salah. Saya berasumsi sama tetapi jika Anda memasukkan Foosetelah Barkeduanya Foodan Barakan memiliki nilai 0 dan E.Foo == E.Barakan kembali true. Ini sangat bodoh dan berlawanan dengan intuisi tapi itu benar :(
Pawcio