Der Operator ==
ist statisch, nicht virtuell, daher wird das Verhalten vom statischen Typ und nicht vom Laufzeittyp bestimmt. Die Standard Implementierung für ==
auf Objekte des Referenztyps ist, die Referenzen zu vergleichen (obwohl Typen ein anderes Verhalten implementieren können, z. B. string
). Sie haben zwei verschiedene Objekte und sie haben nicht die gleiche Referenz, so dass ==
false zurückgibt.
Die Lösung, wie Sie darauf hinweisen, ist die Verwendung von Equals. Equals ist eine virtuelle Methode. Da value1
Laufzeittyp Int32
hat, rufen Sie am Ende Int32.Equals. sehen von .NET Reflector können Sie, dass die Umsetzung dieser ist wie folgt:
public override bool Equals(object obj)
{
return ((obj is int) && (this == ((int) obj)));
}
Mit anderen Worten, es wird geprüft, ob das Argument vom Typ int
, und wenn ja, wirft sie und verwendet die ==
, die für definiert ist int
. Dies vergleicht die Werte der ganzen Zahlen.
Ist der einzige Weg, um dies zu beheben mit .Equals() -Methode zu gehen?
Eine Alternative ist, Ihre Objekte zu int
werfen und dann ==
verwenden, ebenso wie die Implementierung von Int32.Equals
tut.
Die sagen, sie sind gleich, aber zwei verschiedene Instanzen –
Dude, == und .Equals tun 2 verschiedene Dinge. == Der Operator überprüft, ob val1 und val2 den gleichen Speicherplatz belegen (Referenz). .Equals prüft auf Gleichheit der Inhalte. – Icemanind
Sie können auch die statische Methode 'object.Equals (object, object)' verwenden, die zuerst versucht, die Objekte mit dem Operator '==' zu vergleichen, und dann die Methode 'object.Equals (object) ', wenn beide Parameter vorhanden sind nicht null. Der Grund, warum ich es vorschlage, ist, dass Sie nicht vor dem Aufruf von 'object.Equals (object, object) 'auf Null überprüfen müssen, während Sie dies tun, wenn Sie' object.Equals (object) 'aufrufen. –