Согласно документации оператора ==
в MSDN,
Для предопределенных типов значений оператор равенства (==) возвращает true, если значения его операндов равны, в противном случае - false. Для ссылочных типов, отличных от string, == возвращает true, если два его операнда ссылаются на один и тот же объект. Для типа строки == сравнивает значения строк. Пользовательские типы значений могут перегружать оператор == (см. Оператор). То же самое можно сказать и о пользовательских ссылочных типах, хотя по умолчанию == ведет себя так, как описано выше, для стандартных и пользовательских ссылочных типов.
Так почему этот фрагмент кода не компилируется?
bool Compare<T>(T x, T y) { return x == y; }
Я получаю сообщение об ошибке. Оператор '==' не может быть применен к операндам типа 'T' и 'T'. Интересно почему, поскольку, насколько я понимаю, оператор ==
предопределен для всех типов?
Редактировать: Спасибо всем. Сначала я не заметил, что утверждение касается только ссылочных типов. Я также подумал, что побитовое сравнение предоставляется для всех типов значений, что, как я теперь знаю, не является правильным.
Но, если я использую ссылочный тип, будет ли оператор ==
использовать предопределенное сравнение ссылок, или он будет использовать перегруженную версию оператора, если тип определен?
Изменить 2: методом проб и ошибок мы узнали, что оператор ==
будет использовать предопределенное сравнение ссылок при использовании неограниченного универсального типа. Фактически, компилятор будет использовать лучший метод, который он может найти для аргумента ограниченного типа, но не будет искать дальше. Например, приведенный ниже код всегда будет печатать true
, даже когда Test.test<B>(new B(), new B())
:
class A { public static bool operator==(A x, A y) { return true; } }
class B : A { public static bool operator==(B x, B y) { return false; } }
class Test { void test<T>(T a, T b) where T : A { Console.WriteLine(a == b); } }