Gemäß der Dokumentation des ==
Operator in MSDN,Kann nicht Operator == auf generische Typen in C# angewendet werden?
Bei vordefinierten Wertetypen, die Gleichheitsoperator (==) liefert true, wenn die Werte der Operanden gleich sind, andernfalls false. Bei Referenztypen anders als string, gibt == true zurück, wenn seine beiden Operanden auf dasselbe Objekt verweisen. Beim String-Typ vergleicht == die Werte der Strings. Benutzerdefinierte Werttypen können den Operator == überladen (siehe Operator). So können benutzerdefinierte Referenztypen, obwohl standardmäßig == verhält sich wie oben beschrieben für beide vordefinierte und benutzerdefinierte Referenztypen.
Warum kann dieses Code-Snippet nicht kompiliert werden?
void Compare<T>(T x, T y) { return x == y; }
erhalte ich die Fehler Operator '==' kann nicht auf Operanden vom Typ 'T' und 'T' angewendet werden. Ich frage mich warum, denn soweit ich das verstehe ist der ==
Operator für alle Typen vordefiniert?
Bearbeiten: Vielen Dank an alle. Ich habe zunächst nicht bemerkt, dass es in der Aussage nur um Referenztypen ging. Ich dachte auch, dass Bit-für-Bit-Vergleich für alle Werttypen zur Verfügung gestellt wird, die ich jetzt weiß, ist nicht richtig.
Aber wenn ich einen Referenztyp verwende, würde der Operator ==
den vordefinierten Referenzvergleich verwenden, oder würde er die überladene Version des Operators verwenden, wenn ein Typ definiert ist?
Bearbeiten 2: Durch Versuch und Irrtum erfuhren wir, dass der Operator ==
den vordefinierten Referenzvergleich verwenden wird, wenn ein unbeschränkter generischer Typ verwendet wird. Tatsächlich wird der Compiler die beste Methode verwenden, die er für das Argument mit eingeschränktem Typ finden kann, wird aber nicht weiter suchen. Zum Beispiel wird der folgende Code immer true
drucken, auch wenn Test.test<B>(new B(), new B())
genannt wird:
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); } }
wieder meine Antwort Siehe die Antwort auf Ihre followup Frage. –
Es kann nützlich sein, zu verstehen, dass es auch ohne Generika einige Typen gibt, bei denen das '==' zwischen zwei Operanden desselben Typs nicht erlaubt ist. Dies gilt für 'struct'-Typen (außer" vordefinierte "Typen), die den' operator == 'nicht überladen. Als einfaches Beispiel versuchen Sie dies: 'var map = typeof (string) .GetInterfaceMap (typeof (ICloneable)); Console.WriteLine (Karte == Karte);/* Kompilierzeit Fehler */' –
Fortsetzung meiner eigenen alten Kommentar. Zum Beispiel (siehe [anderer Thread] (https://stackoverflow.com/questions/6379915/)), mit 'var kvp1 = new KeyValuePair(); var kvp2 = kvp1; ', dann können Sie' kvp1 == kvp2' nicht überprüfen, da 'KeyValuePair <,>' eine Struktur ist, kein vordefinierter C# -Typ ist und den 'operator ==' nicht überlädt. Ein Beispiel ist gegeben durch 'var li = new List (); var e1 = li.GetEnumerator(); var e2 = e1; 'mit dem man' e1 == e2' nicht machen kann (hier haben wir die verschachtelte Struktur 'List <>. Enumerator' ('' '' List'1 + Enumerator [T] "' 'zur Laufzeit)) die nicht '== 'überlädt. –