Warum wird == in System.Double überschrieben, aber nicht in System.Int32 und was sind die Auswirkungen davon?

9

In C # Warum überschreibt Double == , aber Int32 nicht und was ist der Effekt?

Ich schaue auf die msdn-Bibliothek.

Ich sehe diesen Link über double, der nicht viel hier sagt (obwohl ich verstehe double ist eine Abkürzung für das Double -Objekt) .. Es zeigt keine Methoden zum Beispiel ..

aber dieser Link auf System.Double erwähnt, wonach ich suche hier

Es zeigt, dass der Operator "Gleichheit" doppelte Werte annimmt, also überladen ist.

Bild für Double in MSDN, dann nach Methoden (vor dem Auflisten von Feldern), zeigt es Operatoren, und es zeigt, dass Gleichheitsoperator überschrieben wird

und ich kann Equality unter "Operatoren" anklicken und es steht

%Vor%

Wenn ich mir System.Int32 anschaue Image für Int32 in MSDN ist unter

In diesem Bild (die Seite für System.Int32 ) sieht es so aus, als ob == nicht überschrieben wird.

Warum und was sind die Konsequenzen davon?

    
barlop 21.04.2014, 19:56
quelle

3 Antworten

3

Ein möglicher Grund ist wegen der Double.NaN.

Für den == Operator : MSDN sagt: Wenn zwei Double. NaN-Werte werden auf Gleichheit getestet, indem der Gleichheitsoperator (==) verwendet wird, das Ergebnis ist falsch; Zwei Double.NaN-Werte werden nicht als gleich angesehen. Wenn sie durch Aufrufen der Equals-Methode auf Gleichheit getestet werden, ist das Ergebnis wahr. Wenn Sie ermitteln möchten, ob der Wert eines Double keine Zahl (NaN) ist, können Sie alternativ die IsNaN-Methode aufrufen.

Also haben der ==-Operator und die Equals-Methode von Double ein unterschiedliches Verhalten bezüglich Double.NaN, ich denke, das ist warum == ist Override für Double. Wie für Int, gibt es keinen solchen speziellen Fall.

Der Code, um die Unterschiede zu demonstrieren:

%Vor%

Der Code stammt auch von MSDN

    
Matt 21.04.2014 20:20
quelle
1

Int32 scheint in Bezug auf .NET sehr speziell zu sein. Die Funktionalität, die im Quellcode fehlt, ist mehr als wahrscheinlich in den Kern des Systems gebacken.

Sie können Strukturen / Werttypen nicht mit == , > usw. vergleichen, ohne diese Operatoren innerhalb der Struktur zu deklarieren. Weil Int32 fehlt, bin ich zu dem obigen Schluss gekommen.

Wenn Sie einen einfachen Test machen und die IL ablegen, machen sie genau den gleichen Vergleich und es wird kein CompareTo oder Equals aufgerufen (was ich tatsächlich dachte. Ich habe etwas gelernt!).

%Vor%

Die obige IL hat nur den Standard ceq opcode aufgerufen beide Fälle. Nach .NET-Standards sollte Int32 die Vergleichsoperatoren im Quellcode deklarieren, tut dies aber nicht.

BEARBEITEN: Es scheint, als ob alle ganzzahligen Werttypen wie folgt aussehen. Single, Double, Decimal alle haben die Operatoren im Quellcode angegeben. Int16, Int32, Int64, Byte, nicht.

    
TyCobb 21.04.2014 22:49
quelle
-1

Mit ILSpy kann ich sehen, dass Double.Equals eine zusätzliche Logik hat, um zu überprüfen, ob der zu vergleichende Wert NaN ist.

ILSpy dekompiliert auch den Körper von == zu diesem:

%Vor%

Die anderen Operatoren folgen demselben Muster, was seltsam ist. Vielleicht ein Dekompilierungsfehler?

    
Artfunkel 21.04.2014 20:13
quelle

Tags und Links