2016-02-04 8 views
5

Mam enum z wartością niestandardową tylko część listyEnum z określonymi wartościami tylko niektórzy członkowie

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

Kiedy próbował strina name = (MyEnum)2; nazwa była ThirdValue.

Ale kiedy zmienił enum do

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

W strina name = (MyEnum)2; imię było FifthValue.

Czy kompilator (używam programu Visual Studio 2012) inicjuje niestandardowe wartości tylko wtedy, gdy pierwsza ma niestandardowe wartości?

A jeśli ThirdValue dostał domyślną wartość 2 w pierwszym przykładzie, to dlaczego nie wystąpił błąd w FifthValue = 2?

+4

wartości w początkowej przykład byłoby 0, 1, 2, 1, 2. Zarówno 'ThirdValue 'i' FifthValue' odpowiada wartości całkowitej 2, więc debugger właśnie wybiera jedną z wartości dla ciebie. –

Odpowiedz

6

Po przypisaniu wartości dla członka enum, kompilator zwiększa wartość o jeden dla kolejnego członka, chyba że jest to określone. Jeśli żaden z członków mają wartości, numeracja zaczyna się od 0.

Twój pierwszy przykład z tego, co robi kompilator jest:

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

więc trzeba dwa członkom wartości 2.

Daj im wszystkie wartości lub nie podawaj żadnych wartości. Coś innego prawdopodobnie doprowadzi do zamieszania.

™ # średnia C section 14.3 mówi (kopalnia nacisk)

Związane wartość członu wyliczeniowego jest przyporządkowana bezpośrednio lub pośrednio. Jeśli deklaracja elementu wyliczającego ma inicjator z wyrażeniem stałym, wartość tego stałego wyrażenia, niejawnie przekształcona w podstawowy typ wyliczenia, jest powiązaną wartością elementu wyliczającego. Jeżeli deklaracja członka enum ma inicjatora, wiąże jego wartość jest ustawiona domyślnie, co następuje:

  • Jeżeli członek enum jest pierwszym członkiem enum zadeklarowane w typu enum, wiąże jego wartość jest równa zero.
  • W przeciwnym razie powiązana wartość elementu wyliczającego jest uzyskiwana przez zwiększając powiązaną wartość tekstowego elementu wyliczającego poprzedzającego o jeden. Ta zwiększona wartość musi znajdować się w zakresie wartości, które mogą być reprezentowane przez typ bazowy; w przeciwnym razie wystąpi błąd podczas kompilacji.
+0

Huh. Zastanawialiśmy się nad tym i zastanawialiśmy się, co się stanie, jeśli podążysz za jednym elementem, który ma maksymalną wartość (domyślnie typem podstawowym dla wartości wyliczeniowych jest int) przez element bez określonego numeru - otrzymasz [CS0543] (https://msdn.microsoft.com/en-us/library/b531f703.aspx): "* wartość modułu wyliczającego jest zbyt duża, aby zmieścić się w jej typie *". –

2

Odpowiednie wartości całkowite, które wyliczane wartości są odwzorowywane, zawsze zaczynają się od 0, chyba że konkretnie zmieniono wartości.

Jako takie, Twój pierwszy kawałek kodu jest równoważne to:

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

Więc widać, że 2 mapy dla obu ThirdValue i FifthValue.

Twój Drugi przykład jest równoważny do tego:

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

Więcej niż jeden moduł wyliczający może mieć tę samą wartość. Jeśli nie chcesz, aby określić wartość dla każdego wyliczający, wystarczy zmienić kolejność zdefiniować rachmistrzów:

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