, вот в чем причина.

ал исходный кодEqualityComparer<T>.Default и обнаружил, что это не так умно. Вот пример:

enum MyEnum : int { A, B }
EqualityComparer<MyEnum>.Default.Equals(MyEnum.A, MyEnum.B)
//is as fast as 
EqualityComparer<int>.Default.Equals(0, 1)

enum AnotherEnum : long { A = 1L, B = 2L }
//is 8x slower than
EqualityComparer<long>.Default.Equals(1L, 2L)

Причина очевидна из исходного кода частного метода в EqualityComparer.

private static EqualityComparer<T> CreateComparer()
{
    //non-important codes are ignored
    if (c.IsEnum && (Enum.GetUnderlyingType(c) == typeof(int)))
    {
        return (EqualityComparer<T>) RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType) typeof(EnumEqualityComparer<int>), c);
    }
    return new ObjectEqualityComparer<T>();
}

Мы можем увидетьEqualityComparer<int>.Default,EqualityComparer<MyEnum>.Default а такжеEqualityComparer<long>.Default получить мудрый компаратор которогоEquals Метод выглядит так:

public static bool Equals(int x, int y)
{
    return x == y;  //or return x.Equals(y); here 
                    //I'm not sure, but neither causes boxing
}

public static bool Equals(MyEnum x, MyEnum y)
{
    return x == y;  //it's impossible to use x.Equals(y) here 
                    //because that causes boxing
}

Выше дваумная, ноEqualityComparer<AnotherEnum>.Default повезло, из метода, который мы видим, наконец, он получаетObjectEqualityComparer<T>(), чьяEquals Метод, вероятно, выглядит так:

public static bool Equals(AnotherEnum x, AnotherEnum y)
{
    return x.Equals(y);   //too bad, the Equals method is from System.Object
                       //and it's not override, boxing here!
                       //that's why it's so slow
}

Я думаю это условиеEnum.GetUnderlyingType(c) == typeof(int) бессмысленно, если базовый тип перечисления имеет тип int, метод можетперерабатывать стандартное сравнение int с этим перечислением. Но почему enum не может основываться на long? Это не так сложно, я думаю? Есть какая-то особая причина? Построение компаратора какx == y не так уж сложно перечислить, верно? Почему наконец это дает медленныйObjectEqualityComparer<T> для перечислений (даже это работает правильно)?

Ответы на вопрос(1)

Ваш ответ на вопрос