Warum (und wie) beeinflusst die Reihenfolge eines Enums den ToString-Wert?

8

Hey Leute, ich habe Probleme mit der "Ordnung" der Werte eines Enums. Es ist ein bisschen schwierig zu erklären, deshalb habe ich einen Code geschrieben:

%Vor%

Die Ausgabe ist:

Aufzählung A: Zwei Zwei Zwei Vier

Aufzählung B: Drei Drei Drei Vier

Aufzählung C: Ein Ein Ein Vier

Meine Frage ist: WARUM !? Ich kann die Logik zur Ausgabe nicht finden. Die meiste Zeit gibt es eine gewisse Logik, und ich hoffe, ihr könnt etwas Licht in dieses Thema bringen.

Ich habe VS2010 / .Net 4.0 verwendet, um den Code zu kompilieren und auszuführen.

    
Kees C. Bakker 04.01.2011, 10:20
quelle

2 Antworten

12

Das Verhalten wird als "nicht definiert" angegeben (ich dachte, ich hätte gerade ein Muster entdeckt, aber anscheinend nicht.) Die Dokumentation ruft dies explizit auf:

  

Wenn mehrere Aufzählungselemente denselben zugrunde liegenden Wert haben und Sie versuchen, die Zeichenfolgendarstellung des Namens eines Aufzählungsmembers basierend auf seinem zugrunde liegenden Wert abzurufen, sollte Ihr Code keine Annahmen darüber treffen, welchen Namen die Methode zurückgibt.

Entweder machen Sie Ihre Enum-Werte unterschiedlich oder erstellen explizit eine Map von Wert zu gewünschtem Namen.

    
Jon Skeet 04.01.2011, 10:24
quelle
5

Wenn Sie die IL dekompilieren, sollten Sie als erstes beobachten, dass die Aufrufe von WriteLine alle sehr ähnlich aussehen:

%Vor%

Das heißt, das Laden dieser Aufzählungswerte lädt den Wert "1" dreimal und ruft dann WriteLine auf. Daher sollten wir uns nicht wundern, dass die ersten 3 Aufrufe alle zum selben Wert führen.

Ich habe ein paar Experimente ausprobiert, kann aber nicht auf ein bestimmtes (undokumentiertes) Verhalten verweisen, auf das Sie sich verlassen können, um vorherzusagen, welcher Wert gedruckt wird.

    
Damien_The_Unbeliever 04.01.2011 10:36
quelle

Tags und Links