Secondo la documentazione ==
dell'operatore in MSDN ,
Per tipi di valore predefiniti, l'operatore di uguaglianza (==) restituisce vero se i valori dei suoi operandi sono uguali, falso altrimenti. Per tipi di riferimento diversi da string, == restituisce true se i suoi due operandi si riferiscono allo stesso oggetto. Per il tipo di stringa, == confronta i valori delle stringhe. I tipi di valori definiti dall'utente possono sovraccaricare l'operatore == (vedi operatore). Anche i tipi di riferimento definiti dall'utente possono essere definiti, sebbene per impostazione predefinita == si comporti come descritto sopra sia per i tipi di riferimento predefiniti che per quelli definiti dall'utente.
Quindi perché questo frammento di codice non viene compilato?
bool Compare<T>(T x, T y) { return x == y; }
Ottengo l'errore L' operatore '==' non può essere applicato agli operandi di tipo 'T' e 'T' . Mi chiedo perché, dal momento che capisco l' ==
operatore è predefinito per tutti i tipi?
Modifica: grazie a tutti. All'inizio non ho notato che l'affermazione riguardava solo i tipi di riferimento. Ho anche pensato che il confronto bit per bit è previsto per tutti i tipi di valore, che ora so non è corretto.
Ma, nel caso in cui sto usando un tipo di riferimento, l' ==
operatore userebbe il confronto di riferimento predefinito, o userebbe la versione sovraccarica dell'operatore se un tipo ne definisse uno?
Modifica 2: attraverso prove ed errori, abbiamo appreso che l' ==
operatore utilizzerà il confronto di riferimento predefinito quando utilizza un tipo generico senza restrizioni. In realtà, il compilatore utilizzerà il metodo migliore che può trovare per l'argomento di tipo limitato, ma non cercherà oltre. Ad esempio, il codice seguente verrà sempre stampato true
, anche quando Test.test<B>(new B(), new B())
viene chiamato:
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); } }
==
non è consentito tra due operandi dello stesso tipo. Questo vale per i struct
tipi (tranne i tipi "predefiniti") che non sovraccaricano il file operator ==
. A titolo di esempio, prova questo:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
, quindi non puoi controllare kvp1 == kvp2
perché KeyValuePair<,>
è uno struct, non è un tipo predefinito C # e non sovraccarica il file operator ==
. Tuttavia, viene fornito un esempio var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
con cui non è possibile eseguire e1 == e2
(qui abbiamo la struttura nidificata List<>.Enumerator
(chiamata "List`1+Enumerator[T]"
dal runtime) che non sovraccarica ==
).
bool
da un void
...