Відповідно до документації ==
оператора в MSDN ,
Для заданих типів значень оператор рівності (==) повертає істину, якщо значення його операндів рівні, інакше помилкові. Для типів посилань, крім рядка, == повертає значення 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
...