2009-03-17 9 views
13

Pourquoi ce retour FauxEnum boxe et l'égalité

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; 
    } 

tout cela retourne vrai?

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

Répondre

21

Enum n'implémente pas l'opérateur d'égalité == mais remplace la méthode Equals. Comme il n'implémente pas ==, le système effectue une vérification d'égalité de référence.

Notez que System.Enum est une classe pas une structure. Par conséquent, des valeurs telles que Directions.Left sont encadrées. Dans ce cas particulier, les objets encadrés finissent par être des objets séparés, ce qui fait qu'ils échouent à un test d'égalité de référence.

Le compilateur comprend == pour les types Enum concrets (tels que Directions), mais le compilateur n'effectue pas ce traitement spécial par rapport au type System.Enum.

+0

Nice. "Boxe" n'est pas vraiment une explication complète, comme le vôtre. – core

+1

Merci pour l'explication technique! – Greg

4

Comme le dit JB, la boxe. Vous pouvez voir ceci en changeant de Enum à Directions:

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

vrai est retourné.