2013-02-19 26 views
21

Orada bir geçerli:Enum için geçiş neden örtülü dönüştürme 0'a kabul eder, ancak başka bir tamsayıya neden olmaz?

enum SomeEnum 
{ 
    A = 0, 
    B = 1, 
    C = 2 
} 

Şimdi derleyici yazmak beni tanır:

SomeEnum x = SomeEnum.A; 
switch(x) 
{ 
    case 0: // <--- Considered SomeEnum.A 
     break; 
    case SomeEnum.B: 
     break; 
    case SomeEnum.C: 
     break; 
    default: 
     break; 
} 

0SomeItems.A kabul edilir. Ama yazamıyorum:

SomeEnum x = SomeEnum.A; 
switch(x) 
{ 
    case 0: 
     break; 
    case 1: // <--- Here is a compilation error. 
     break; 
    case SomeEnum.C: 
     break; 
    default: 
     break; 
} 

0 için sadece örtük dönüştürme var ki?

+2

Eric Lippert'in benzer bir soruya yanıtını görün: http: // stackoverflow.com/a/14238286/414076 –

cevap

16

ECMA-334 (C# Language Specification) kaynaktan

13.1.3 Örtülü numaralandırma dönüşüm

Örtülü bir numaralandırma dönüşüm ondalık tamsayı değişmezi 0 herhangi bir enum tipi dönüştürülmesini sağlar.

enum's varsayılan değer 0 ve derleme zamanında o anahtar deyiminde izin yüzden bilinmektedir. 0'dan başka bir değer için, bu değerin enum içinde olup olmayacağını derleme zamanında belirleyemez. ek değerler çeteleler yeni versiyonlarını atama veya yeni sürümde enum üyelerinin değerlerini değiştirerek

enum (C# Reference)

, bağımlı kaynak kodu için sorunlara neden olabilir. Genellikle, anahtar deyimlerinde enum değerlerinin kullanması ve enum türüne ek öğeleri eklendiyse, varsayılan değerler testi beklenmedik şekilde true döndürülebilir. switch açıklamada 0 ile sözdizimi yerine tam enum hata eğilimli duruma geçmesi

+1

Neden böyle bir açıklama buldunuz? –

+0

@yBee, sanırım onun enum'un varsayılan değeri, tamsayı tabanlı bir değer türü olan "0" olmasıdır. – Habib

+0

Şimdi, eğer ör. bir "struct" veya "class" alanları başlatıldı. Bu nedenle, enum türünde bir alan varsa, bu enumda böyle bir öğe olmasa bile değeri "0" olur. Yani alan _cunfused_ durumunda, ancak hala geçerli. Bu yüzden, çok basit ve değişmez enum olsa bile, her zaman 'default' etiketini kullanmalıyız. –

2

Ben de eklersiniz. Aşağıdaki kodu düşünün:

enum TestEnum 
{ 
    NA = 0, 
    A 
} 

ve bu derler ve iyi çalışıyor sonra

var e = TestEnum.NA; 
switch(e) 
{ 
    case 0: 
     { 
      break; 
     } 
    case TestEnum.A: 
     { 
      break; 
     } 
} 

. nedense enum beyan

enum TestEnum 
{ 
    NA = 1, 
    A 
} 

her şeyi değiştirir Ancak kırık alacak.

rağmen durumların çoğunda enum için varsayılan değer 0 ve bu sözdizimi gerçekleşebilir bu nedenle, ben tam enum kullanmak.

+1

komik bir şey yok '0' SomeEnum' 'de, hala' yazabilirsiniz olduğunu bu yüzden 'A' için' 3 'değiştireceğiz bile yani, SomeEnum x = 0' ve 'case 0:' etiketini yakalayın. –

+0

@yBee Diğer cevabı okuyun, her zaman bir enum için 0 değeri vardır, dil özelliğinde tanımlanan numara türü için varsayılan değerdir. –

+0

@yBee büyük bir uyarı ... Bunu fark etmemiştim bile. Benim için olduğu gibi, 'enums' – horgh

İlgili konular