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

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

Ответ 1

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

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

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

Ответ 2

Как говорит 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.