Оператор '==' нельзя применить к типу T?

я подумал, что этот метод действителен, но ошибся:

static void Equals(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? Я не думаю, что в этом случае возможно «не удается выбрать разрешение перегрузки».

РЕДАКТИРОВАТЬ Этот вопрос пришел мне в голову, когда я реализовал что-то вроде этого:

class EnumComparer : IEqualityComparer
{
    public bool Equals(TEnum x, TEnum y)
    {
        return x == y;
    }
    public int GetHashCode(TEnum obj)
    {
        return (int)obj;
    }
}

Боюсь, мне нужно построить выражение и вызвать его динамически в методе Equals . На самом деле здесь есть довольно хорошее объяснение: http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm ...

Я понимаю разницу между тем, как работает синтаксический анализатор SAX, и синтаксический анализатор XMLPull. На самом деле здесь есть довольно хорошее объяснение:

http://www.firstobject.com/xml-reader-sax-vs-xml-pull-parser.htm Статья немного ориентирована на .NET, но концепции применимы.

Хотя я согласен с мнением автора, что с синтаксическим анализатором Pull легче работать, я не совсем понимаю, какой тип синтаксического анализатора будет лучше в каких ситуациях . Если бы кто-нибудь мог пролить свет и указать мне на дополнительную литературу, я был бы признателен.

Спасибо.

21
задан Nelson Ramirez 27 April 2011 в 17:27
поделиться