Gemäß der Dokumentation des ==
Betreibers in MSDN ,
Für vordefinierte Werttypen gibt der Gleichheitsoperator (==) true zurück, wenn die Werte seiner Operanden gleich sind, andernfalls false. Für andere Referenztypen als Zeichenfolge 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). Dies gilt auch für benutzerdefinierte Referenztypen, obwohl sich == standardmäßig wie oben für vordefinierte und benutzerdefinierte Referenztypen beschrieben verhält.
Warum kann dieses Code-Snippet nicht kompiliert werden?
bool Compare<T>(T x, T y) { return x == y; }
Ich erhalte den Fehler Operator '==' kann nicht auf Operanden vom Typ 'T' und 'T' angewendet werden . Ich frage mich warum, da der ==
Operator meines Wissens für alle Typen vordefiniert ist.
Edit: Danke an alle. Ich habe zunächst nicht bemerkt, dass es sich bei der Aussage nur um Referenztypen handelt. Ich dachte auch, dass ein bitweiser Vergleich für alle Werttypen bereitgestellt wird, von denen ich jetzt weiß, dass sie nicht korrekt sind.
==
Wenn ich jedoch einen Referenztyp verwende, würde der Operator den vordefinierten Referenzvergleich verwenden oder würde er die überladene Version des Operators verwenden, wenn ein Typ einen definiert?
Bearbeiten 2: Durch Versuch und Irrtum haben wir erfahren, dass der ==
Operator den vordefinierten Referenzvergleich verwendet, wenn er einen uneingeschränkten generischen Typ verwendet. Tatsächlich verwendet der Compiler die beste Methode, die er für das Argument des eingeschränkten Typs finden kann, sucht jedoch nicht weiter. Der folgende Code wird beispielsweise immer gedruckt true
, auch wenn er Test.test<B>(new B(), new B())
aufgerufen 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); } }
==
zwischen zwei Operanden desselben Typs nicht zulässig ist. Dies gilt für struct
Typen (außer "vordefinierten" Typen), die das nicht überladen operator ==
. Versuchen Sie als einfaches Beispiel Folgendes:var map = typeof(string).GetInterfaceMap(typeof(ICloneable)); Console.WriteLine(map == map); /* compile-time error */
var kvp1 = new KeyValuePair<int, int>(); var kvp2 = kvp1;
, dann können Sie nicht überprüfen, kvp1 == kvp2
da KeyValuePair<,>
es sich um eine Struktur handelt, es sich nicht um einen vordefinierten C # -Typ handelt und der nicht überladen wird operator ==
. Es wird jedoch ein Beispiel gegeben, var li = new List<int>(); var e1 = li.GetEnumerator(); var e2 = e1;
mit dem Sie nicht arbeiten können e1 == e2
(hier haben wir die verschachtelte Struktur List<>.Enumerator
( "List`1+Enumerator[T]"
von der Laufzeit aufgerufen ), die nicht überladen wird ==
).
bool
von einem void
...