2009-03-17 6 views
13

Warum funktioniert dasEnum Boxen und Gleichheit

public enum Directions { Up, Down, Left, Right } 

    static void Main(string[] args) 
    { 
     bool matches = IsOneOf(Directions.Right, Directions.Left, Directions.Right); 
     Console.WriteLine(matches); 
     Console.Read(); 
    } 

    public static bool IsOneOf(Enum self, params Enum[] values) 
    { 
     foreach (var value in values) 
      if (self == value) 
       return true; 
     return false; 
    } 

Falsch zurückzukehren, während diese True zurückgibt?

public static bool IsOneOf(Enum self, params Enum[] values) 
    { 
     foreach (var value in values) 
      if (self.Equals(value)) 
       return true; 
     return false; 
    } 

Antwort

21

Enum implementiert keinen == Gleichheitsoperator, überschreibt jedoch die Equals-Methode.

Da es == nicht implementiert, führt das System eine Referenzgleichheitsprüfung durch. Beachten Sie, dass System.Enum eine Klasse und keine Struktur ist. Daher sind Werte wie "Directions.Left" eingerahmt. In diesem speziellen Fall enden die eingerahmten Objekte als getrennte Objekte, weshalb sie einen Referenzgleichheitstest nicht bestehen.

Der Compiler versteht == für konkrete Enum-Typen (z. B. Richtungen), aber der Compiler führt diese spezielle Verarbeitung nicht gegen den System.Enum-Typ.

+0

Schön. "Boxen" ist nicht wirklich eine vollständige Erklärung, wie es bei Ihnen der Fall ist. – core

+1

Vielen Dank für die technische Erklärung! – Greg

4

Wie JB sagt, Boxen. Sie können dies sehen, indem Sie von Enum zu Directions wechseln:

public static bool IsOneOf(Directions self, params Directions[] values) 
{ 
    foreach (var value in values) 
     if (self == value) 
      return true; 
    return false; 
} 

true wird zurückgegeben.