408 Stimmen

Kann der Operator == nicht auf generische Typen in C# angewendet werden?

Laut der Dokumentation des == Betreiber in MSDN ,

Für den vordefinierten Wert t Gleichheitsoperator (==) true zurück, wenn die Werte seiner Operanden gleich sind, andernfalls falsch. Für Referenztypen mit Ausnahme von String gibt == wahr zurück, wenn seine beiden Operanden sich auf dasselbe Objekt beziehen. Für den Typ string vergleicht == die Werte der Zeichenketten vergleichen. Benutzerdefinierte Wertetypen können überladen Operator überladen (siehe Operator). So können benutzerdefinierte Referenztypen, obwohl standardmäßig == verhält sich wie oben beschrieben, sowohl für vordefinierte als auch für benutzerdefinierte Referenztypen.

Warum lässt sich dieses Codeschnipsel nicht kompilieren?

bool Compare<T>(T x, T y) { return x == y; }

Ich erhalte die Fehlermeldung Der Operator '==' kann nicht auf Operanden des Typs 'T' und 'T' angewendet werden . Ich frage mich, warum, denn soweit ich weiß, ist die == Operator für alle Typen vordefiniert ist?

Edita: Vielen Dank an alle. Ich habe zuerst nicht bemerkt, dass sich die Aussage nur auf Referenztypen bezieht. Ich dachte auch, dass der Bit-für-Bit-Vergleich für alle Wertetypen vorgesehen ist, was, wie ich jetzt weiß, nicht stimmt. no richtig.

Aber, falls ich einen Referenztyp verwende, würde die == Operator den vordefinierten Referenzvergleich verwenden, oder würde er die überladene Version des Operators verwenden, wenn ein Typ einen solchen definiert?

Bearbeiten 2: Durch Versuch und Irrtum haben wir gelernt, dass die == Operator verwendet den vordefinierten Referenzvergleich, wenn er einen unbeschränkten generischen Typ verwendet. Tatsächlich verwendet der Compiler die beste Methode, die er für das Argument des eingeschränkten Typs finden kann, aber er sucht nicht weiter. Zum Beispiel wird der folgende Code immer true 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); } }

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X