Я думал, что этот метод действителен, но я ошибся:
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 в версии 4.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);
поскольку все в С# происходит от Object. Как может произойти ошибка времени компиляции на шаге 3? Я не думаю, что возможно, что "разрешение перегрузки не может выбрать" в этом случае.
EDIT Вопрос пришел мне на ум, когда я реализовал что-то вроде этого:
class EnumComparer<TEnum> : IEqualityComparer<TEnum>
{
public bool Equals(TEnum x, TEnum y)
{
return x == y;
}
public int GetHashCode(TEnum obj)
{
return (int)obj;
}
}
Я боюсь, мне нужно построить выражение и динамически вызвать его в методе Equals
.