Ich bin heute in diese Situation geraten. Ich habe ein Objekt, das ich auf Gleichheit überprüfe; Die Create() -Methode gibt eine Unterklassenimplementierung von MyObject zurück.Wann kann a == b falsch und a.Equals (b) wahr sein?
MyObject a = MyObject.Create();
MyObject b = MyObject.Create();
a == b; // is false
a.Equals(b); // is true
Hinweis Ich habe auch übergegangen Equals() in der Unterklasse Implementierung, die eine sehr grundlegende Überprüfung tut, um zu sehen, ob das übergebene Objekt null ist und ist vom Typ der Unterklasse. Wenn diese beiden Bedingungen erfüllt sind, gelten die Objekte als gleich.
Das andere leicht Seltsame ist, dass meine Unit-Test-Suite hat einige Tests ähnlich wie
Assert.AreEqual(MyObject.Create(), MyObject.Create()); // Green bar
und das erwartete Ergebnis beobachtet wird. Daher nehme ich an, dass NUnit a.Equals (b) unter den Deckblättern verwendet, anstatt a == b, wie ich angenommen hatte.
Seitennotiz: Ich programmiere in einer Mischung von .NET und Java, also könnte ich hier meine Erwartungen/Annahmen durcheinanderbringen. Ich dachte jedoch, dass a == b in .NET konsistenter arbeitete als in Java, wo Sie oft equals() verwenden müssen, um die Gleichheit zu testen.
UPDATE Hier ist die Implementierung von Equals(), wie gewünscht:
public override bool Equals(object obj) {
return obj != null && obj is MyObjectSubclass;
}
Könnten wir Ihre Implementierung der .Equals() überschreiben – msarchet
Bitte schreiben Sie den Code für die überschriebene Equals-Funktion. – AxelEckenberger
wenn einer aber nicht beide natürlich überschrieben wird :) – RCIX