я подумал, что этот метод действителен, но ошибся:
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 получены из общий базовый тип, затем общий операторы-кандидаты встречаются только в комбинированный набор один раз.
Если набор кандидат определяемых пользователем операторов не пусто, тогда это становится набором кандидатов в операторы операция. В противном случае предопределенный реализации бинарного оператора op, включая их поднятые формы, становятся набор операторов-кандидатов для операция. Предопределенный реализации данного оператора указаны в описании оператор (с §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? Я не думаю, что в этом случае возможно «не удается выбрать разрешение перегрузки».
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
.