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

Nach der Dokumentation des== operator in MSDN,

Bei vordefinierten Wertetypen gibt der Gleichheitsoperator (==) true zurück, wenn die Werte seiner Operanden gleich sind, andernfalls false. Bei anderen Referenztypen als string gibt == true zurück, wenn sich die beiden Operanden auf dasselbe Objekt beziehen. Für den Zeichenfolgentyp vergleicht == die Werte der Zeichenfolgen. Benutzerdefinierte Werttypen können den Operator == überladen (siehe Operator). So können benutzerdefinierte Referenztypen, obwohlby default == verhält sich wie oben für vordefinierte und benutzerdefinierte Referenztypen beschrieben.

So warum kann dieses Code-Snippet nicht kompiliert werden?

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

Ich erhalte den FehlerOperator '==' kann nicht auf Operanden vom Typ 'T' und 'T' angewendet werden. Ich frage mich warum, da soweit ich das @ verste== Operator ist für alle Typen vordefiniert?

Bearbeiten Danke an alle. Ich habe zunächst nicht bemerkt, dass es sich bei der Aussage nur um Referenztypen handelt. Ich dachte auch, dass der bitweise Vergleich für alle Werttypen bereitgestellt wird, von denen ich jetzt weiß, dass sie @ sinnich richtig

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

Edit 2: Durch Versuch und Irrtum haben wir gelernt, dass die==er Operator @ verwendet den vordefinierten Referenzvergleich, wenn ein uneingeschränkter generischer Typ verwendet wird. Tatsächlich verwendet der Compiler die beste Methode, die er für das Argument des eingeschränkten Typs finden kann, sucht aber nicht weiter. Der folgende Code gibt beispielsweise immer @ autrue, sogar wennTest.test<B>(new B(), new B()) wird genannt

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); } }

Antworten auf die Frage(22)

Ihre Antwort auf die Frage