2009-03-17 16 views
13

¿Por qué este return falseEnum boxeo y la Igualdad

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

mientras que esto devuelve True?

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

Respuesta

21

Enum no implementa un operador == igualdad, pero reemplaza el método Equals.

Como no implementa ==, el sistema realiza una comprobación de igualdad de referencia. Tenga en cuenta que System.Enum es una clase, no una estructura. Por lo tanto, los valores tales como Directions.Left están encuadrados. En este caso particular, los objetos enmarcados terminan siendo objetos separados, por lo tanto fallan una prueba de igualdad de referencia.

El compilador comprende == para los tipos Enum concretos (como las Direcciones), pero el compilador no hace este procesamiento especial contra el tipo System.Enum.

+0

Agradable. "Boxeo" no es realmente una explicación completa, como la tuya. – core

+1

¡Gracias por la explicación técnica! – Greg

4

Como dice JB, boxing. Puede ver esto cambiando de Enum a Direcciones:

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

true is returned.