Согласно документации ==
оператора в 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); } }
==
нельзя использовать два операнда одного и того же типа. Это верно для struct
типов (кроме «предопределенных» типов), которые не перегружают operator ==
. В качестве простого примера попробуйте следующее:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
, тогда вы не можете проверить, kvp1 == kvp2
потому что KeyValuePair<,>
это структура, это не предопределенный тип C #, и он не перегружает operator ==
. Тем не менее, приведен пример, var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
с которым вы не можете справиться e1 == e2
(здесь у нас есть вложенная структура List<>.Enumerator
( "List`1+Enumerator[T]"
вызывается средой выполнения), которая не перегружается ==
).
bool
void