Я думал, что этот метод действителен, но я ошибался:
static void Equals<T>(T x, T y)
{
return x == y; //operator == can't be applied to type T
}
После прочтения спецификации (§7.2.4 в v3.0 и §7.3.4 в v4.0):
7.2.4 Разрешение перегрузки двоичного оператора
Операция вида x op y, где op - это перегружаемый двоичный оператор, x - это выражение типа X, а y - это выражениетип Y обрабатывается следующим образом:
Определяется набор пользовательских операторов-кандидатов, предоставляемых X и Y для оператора операции op (x, y).Набор состоит из объединения операторов-кандидатов, предоставленных X, и операторов-кандидатов, предоставленных Y, каждый из которых определяется по правилам §7.2.5.Если X и Y относятся к одному и тому же типу или если X и Y получены из общего базового типа, то операторы-кандидаты совместно используются в объединенном наборе только один раз.
Если наборПользовательские операторы-кандидаты не пустые, тогда они становятся набором операторов-кандидатов для операции.В противном случае предопределенные реализации бинарных операторов, включая их поднятые формы, становятся набором операторов-кандидатов для операции.Предопределенные реализации данного оператора указаны в описании оператора (с §7.7 по §7.11).
Правила разрешения перегрузки согласно §7.4.3 применяются к наборуоператоры-кандидаты выбирают лучший оператор относительно списка аргументов (x, y), и этот оператор становится результатом процесса разрешения перегрузки.Если при разрешении перегрузки не удается выбрать один лучший оператор, возникает ошибка времени компиляции.
На шаге 2 я думаю, что должна применяться эта предопределенная реализация:
bool operator ==(object x, object y);
bool operator !=(object x, object y);
, поскольку все в C # происходит от Object.Как может произойти ошибка времени компиляции на шаге 3?Я не думаю, что это возможно, что «разрешение перегрузки не удается выбрать» в этом случае.
РЕДАКТИРОВАТЬ Вопрос пришёл мне в голову, когда я реализовывал нечто подобное:
class EnumComparer<TEnum> : IEqualityComparer<TEnum>
{
public bool Equals(TEnum x, TEnum y)
{
return x == y;
}
public int GetHashCode(TEnum obj)
{
return (int)obj;
}
}
Боюсь, мне нужно построить выражение и динамически вызывать его в методе Equals
.