16

これが False を返す理由

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

これはTrueを返しますか?

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

2 に答える 2

25

Enum は == 等価演算子を実装しませんが、Equals メソッドをオーバーライドします。

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

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

于 2009-03-17T00:56:28.243 に答える
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 が返されます。

于 2009-03-17T00:53:20.403 に答える