2016-02-04 7 views
5

Ho un enum con valore personalizzato per solo una parte della listaEnum con i valori specificati per solo alcuni dei membri

public enum MyEnum 
{ 
    FirstValue, 
    SecondValue, 
    ThirdValue, 
    ForthValue = 1, 
    FifthValue = 2 
} 

Quando ho provato strina name = (MyEnum)2; nome era ThirdValue.

Ma quando ho cambiato il enum a

public enum MyEnum 
{ 
    FirstValue = 3, 
    SecondValue, 
    ThirdValue, 
    ForthValue = 1, 
    FifthValue = 2 
} 

In strina name = (MyEnum)2; nome era FifthValue.

Il compilatore (sto utilizzando Visual Studio 2012) inizializza i valori personalizzati solo se il primo ha valori personalizzati?

E se ThirdValue ha ottenuto il valore predefinito 2 nel primo esempio, come mai non si è verificato alcun errore in FifthValue = 2?

+4

I valori dell'esempio iniziale sarebbe 0, 1, 2, 1, 2. Sia 'ThirdValue 'e' FifthValue' corrisponde al valore intero 2, in quanto tale, il debugger sta solo selezionando uno dei valori per te. –

risposta

6

Quando si assegna valori per un membro enum, il compilatore incrementa il valore di uno per il prossimo membro, a meno che non è definito. Se nessun membro hanno valori, la numerazione inizia da 0.

tuo primo esempio, con quello che il compilatore sta facendo è:

public enum MyEnum 
{ 
    FirstValue, // == 0 
    SecondValue, // == 1 
    ThirdValue, // == 2 
    ForthValue = 1, 
    FifthValue = 2 
} 

in modo da avere due membri con valore 2.

O date loro tutti i valori o non date loro alcun valore. Qualsiasi altra cosa porterà probabilmente alla confusione.

Il C# standard section 14.3 dice (sottolineatura mia):

Il valore corrispondente di un membro enum viene assegnato implicitamente o esplicitamente. Se la dichiarazione del membro enum ha un inizializzatore di espressioni costanti, il valore di tale espressione costante, implicitamente convertito nel tipo sottostante dell'enumerazione, è il valore associato del membro enum. Se la dichiarazione dell'elemento enum ha inizializzatore, il suo valore associato viene impostato implicitamente, come segue:

  • Se il membro enum è il primo membro enum dichiarato nel tipo enum, suo valore associato è zero.
  • In caso contrario, il valore associato dell'enumerazione viene ottenuto da aumentando il valore associato del membro enum precedente testualmente di uno. Questo valore aumentato deve essere compreso nell'intervallo di valori che può essere rappresentato dal tipo sottostante; in caso contrario, si verifica un errore in fase di compilazione.
+0

Huh. Stavo pensando a questo e mi chiedevo cosa succederà se segui un elemento che ha il valore massimo (per impostazione predefinita, il tipo sottostante per i valori enum è int) per un elemento senza un numero specificato - otterresti [CS0543] (https://msdn.microsoft.com/en-us/library/b531f703.aspx): "* il valore dell'enumeratore è troppo grande per rientrare nel suo tipo *". –

2

I valori interi corrispondenti a cui enum i valori mappano per iniziare sempre a 0 a meno che non si modificino specificamente i valori.

Come tale, il primo pezzo di codice è equivalente a questo:

public enum MyEnum 
{ 
    FirstValue = 0, 
    SecondValue = 1, 
    ThirdValue = 2, 
    ForthValue = 1, 
    FifthValue = 2 
} 

Così si può vedere che 2 mappe sia per ThirdValue e FifthValue.

tuo secondo esempio è equivalente a questo:

public enum MyEnum 
{ 
    FirstValue = 3, 
    SecondValue = 4, 
    ThirdValue = 5, 
    ForthValue = 1, 
    FifthValue = 2 
} 
0

Più di un enumeratore può avere lo stesso valore. Se non si desidera specificare il valore di ogni enumeratore, è sufficiente cambiare l'ordine si definiscono i enumeratori:

public enum MyEnum 
{ 
    FourthValue = 1, 
    FifthValue, 
    FirstValue, 
    SecondValue, 
    ThirdValue 
}