2012-11-16 31 views
8

Mögliche Duplizieren:
Is it necessary to override == and != operators when overriding the Equals method? (.NET)Warum überschreiben == überschreiben muss gleich?

C# Compiler fordert mich auf, dass ich außer Kraft setzen sollte gleich, wenn zwingende ==, ich möchte nur wissen, warum?

+3

möglich duplizieren: http://Stackoverflow.com/q/1222035/238902 – Default

+1

@Default eigentlich glaube ich nicht, dass es ein Duplikat ist - aber sie sind verknüpft. Dieser lautet: "Wenn ich == zur Verfügung stelle, sollte ich Equals überschreiben?" (auf die die Antwort allgemein lautet: ja), wo - wie die andere "beim Überschreiben gleich ist, muss ich == angeben?" (auf die die Antwort allgemein ist: nein, nicht wirklich) –

Antwort

4

Da sonst haben Sie zwei semantisch ähnliche Operationen, die möglicherweise zu unterschiedlichen Ergebnissen führen, was eine Menge Verwirrung bedeutet.

Ich bin mir nicht sicher, ob der Compiler Sie stoppt oder ob es nur eine Warnung ist, aber in jedem Fall ist es in der Regel gut, sicherzustellen, dass sie sich gleich verhalten.

Es gibt so etwas mit double.NaN == double.NaN gegenüber double.NaN.Equals(double.NaN).

+0

+1: interessant, war mir nicht bekannt von 'double.NaN.Equals (double.NaN) == true'. – Henrik

12

Wenn Sie neu zu definieren Gleichheit über ==, wird es wirklich verwirrend, wenn == tut etwas ganz anderes zu .Equals und .Equals hat der Rückfall zu sein, weil, wenn der Typ nicht zum Zeitpunkt der Kompilierung bekannt ist, nur .Equals ist verfügbar. Als Konsequenz bedeutet das Definieren von == wirklich: Definieren von ==, !=, Equals und GetHashCode und möglicherweise Implementieren IEquatable<T> für einige T.

+0

+1 Yeah, 'double.Na' sticht, wenn du das falsch machst :-) –

+0

Es ist nicht möglich, dass' == 'und' Equals' sich in allen Situationen identisch verhalten, und ich denke nicht, dass das erwartet werden sollte . Was hilfreicher wäre, wäre, dass "==" an den Stellen konsistent ist, an denen es verwendbar ist, und "Gleich" überall konsistent ist (da es überall verwendbar ist). Eine Regel, dass numerische Typen, die die gleiche Zahl repräsentieren, "==" vergleichen sollten, auch wenn sie sich in anderer Hinsicht unterscheiden, während nur Dinge, die zu 100% äquivalent sind, mit "Gleich" verglichen werden, wäre IMHO hilfreicher als der jetzt existierende Mischmasch . – supercat

+0

Wie es ist, gibt es keine schöne Möglichkeit, z.B. ein Dictionary, das "Decimal" -Werte ihren String-Repräsentationen zuordnen würde, weil ein Dictionary die Zahlen "1.0m" und "1.00m" nicht unterscheiden kann [deren String-Repräsentationen sich unterscheiden sollten]. Der Operator '==' sollte diese Werte als gleich betrachten, aber das bedeutet nicht, dass 'Equals' sein sollte. Ferner ist die Art, wie Überbelastungen definiert sind, oft nicht in der Lage, eine Äquivalenzbeziehung zu implementieren, und sie prüft nicht wirklich auf numerische Gleichheit, da z. '16777217 == 16777216.0f'. – supercat

1

Da sonst werden Sie unterschiedliche Ergebnisse erhalten, je nachdem, wie Sie den Vergleich durchführen.

x == y Doing ein anderes Ergebnis geben könnte y == x zu tun (wenn x und y verschiedene Typen sind). Andere Vergleiche wie Suchen nach dem Wert in einer Liste oder Verwenden als Schlüssel in einem Wörterbuch verwenden den Operator == nicht, so dass dies überhaupt nicht funktioniert.

+0

Warum könnte anders sein? Was hat Ordnung? –

+0

@ MatíasFidemraizer: Weil 'x == y' den '==' Operator für den 'x' Wert verwenden würde, würde' y == x' den '==' Operator für den 'y' Wert verwenden. Wenn sie anders implementiert sind (z.B.'y' verwendet den Standard-Objektvergleich. Sie geben unterschiedliche Ergebnisse. – Guffa

+0

Ah, ich verstehe. Aber das würde passieren, wenn 'x' und' y' verschiedene Typen haben. Wenn beide den gleichen Typ haben, sollte sich 'x == y' oder' y == x' auf die gleiche Weise verhalten. Vielleicht sollten Sie dies in unserer Antwort darauf hinweisen. –

Verwandte Themen