Enum Бокс и Равенство - PullRequest
       19

Enum Бокс и Равенство

14 голосов
/ 17 марта 2009

Почему это возвращает 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;
    }

Ответы [ 2 ]

23 голосов
/ 17 марта 2009

Enum не реализует оператор равенства ==, но переопределяет метод Equals.

Поскольку он не реализует ==, система выполняет проверку на равенство ссылок. Обратите внимание, что System.Enum - это класс, а не структура. Следовательно, значения, такие как Directions.Left, упакованы. В данном конкретном случае объекты в штучной упаковке оказываются отдельными объектами, поэтому они не проходят тест на равенство ссылок.

Компилятор понимает == для конкретных типов Enum (например, Directions), но компилятор не выполняет эту специальную обработку для типа System.Enum.

4 голосов
/ 17 марта 2009

Как говорит 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 возвращается.

...