Verwendung von String-Repräsentationen von enum-Werten in switch-case

8

Warum können Enum-Werte nicht als Strings in einem Switch-Case verwendet werden? (Oder was ist daran falsch :)

%Vor%     
Bloke 30.04.2012, 16:43
quelle

4 Antworten

22

Sie können nur Zeichenfolgen verwenden, die zum Zeitpunkt der Kompilierung bekannt sind. Der Compiler kann das Ergebnis dieses Ausdrucks nicht bestimmen.

Vielleicht können Sie es versuchen

%Vor%     
Peter Lawrey 30.04.2012, 16:47
quelle
5
  

case MyEnum.VALUE1.toString (): // Ist das nicht gleich "VALUE1"?

Nein, nicht unbedingt: Sie können Ihre eigene Implementierung von toString()

bereitstellen %Vor%

}

Außerdem kann jemand, der Ihren Code verwaltet, diese Implementierung hinzufügen, nachdem Sie das Unternehmen verlassen haben. Deshalb sollten Sie sich nicht auf String-Werte verlassen und stattdessen stattdessen numerische Werte verwenden (wie zB die Konstanten MyEnum.VALUE1 , MyEnum.VALUE2 usw.) von enum s.

    
dasblinkenlight 30.04.2012 16:46
quelle
1

Um den Kommentar von Peter Lawrey hinzuzufügen, schauen Sie sich dies an Beitrag vom letzten Jahr, der diskutiert, String in Java vor und nach JDK7 einschalten.

    
Sanjeev 30.04.2012 18:21
quelle
-1

BEARBEITEN : Entschuldigung für eine C # -Antwort auf eine Java-Frage. Ich weiß nicht, was dort schiefgelaufen ist.

Es ist möglich, Zeichenfolgenwerte (einschließlich der Zeichenfolgenwerte von enums) zu verwenden. Sie können jedoch nur Kompilierzeitkonstanten verwenden. Sie rufen eine Methode ToString() auf, die zur Laufzeit ausgewertet werden muss.

Ab C # 6 können Sie diese konstante Alternative verwenden: case nameof(SomeEnum.SomeValue):

Name von () wird zur Kompilierzeit ausgewertet, einfach zu einer Zeichenkette, die dem (unqualifizierten) Namen der gegebenen Variable, des Typs oder des Mitglieds entspricht. Sein Wert entspricht dem von SomeEnum.ToString() .

    
Timo 30.11.2015 09:36
quelle