2009-03-17 6 views
13

は、なぜこれが 列挙ボクシングと平等

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

Falseを返すのですか?

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

答えて

21

列挙型は等号演算子を実装していませんが、Equalsメソッドをオーバーライドします。

==が実装されていないため、システムは参照等価チェックを実行します。 System.Enumは構造体ではないクラスであることに注意してください。したがって、Directions.Leftなどの値はボックス化されます。この特定のケースでは、ボックス化されたオブジェクトは別々のオブジェクトになるので、参照平等テストは失敗します。

コンパイラは具体的な列挙型(Directionsなど)に対して==を認識しますが、コンパイラはこの特別な処理をSystem.Enum型に対して行いません。

+0

ニース。あなたのように "ボクシング"は本当に完全な説明ではありません。 – core

+1

技術的な説明をありがとうございます! – Greg

4

JBが言うように、ボクシング。これはEnumからDirectionsに変更して見ることができます。

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

trueが返されます。