Es macht absolut Sinn, wenn dieser Code in Object.Equals
überschreiben und Sie wollen den Gleichheitsoperator nicht aufrufen (was zum Beispiel fälschlicherweise den Equals
). Das Casting in ein Objekt ermöglicht den Aufruf des Standard-Gleichheitsoperators, der Referenzen vergleicht.
Normalerweise würden Sie Folgendes verwenden Object.ReferenceEquals
um eine Instanz eines Objekts zu vergleichen mit null
innerhalb Equals
überschreiben.
Dies würde zum Beispiel einen Stapelüberlauf verursachen:
public class Point {
public override bool Equals (object other) {
var otherPoint = other as Point;
if (other == null)
return false;
//...
}
public static bool operator == (Point l, Point r) {
//...
//null checks
if (!l.Equals(r))
return false;
}
}
In dem obigen Beispiel ruft der Gleichheitsoperator Equals
und weil otherPoint
Variable ist vom Typ Point
würde der Gleichheitsoperator aufgerufen, was zu einer unendlichen Rekursion führen würde.
Normalerweise wird beim Überschreiben von Equals
und den Gleichheitsoperator definieren, würden Sie die Vergleichslogik in den Operator packen und diesen von der Equals
überschreiben. Beachten Sie, dass die Klasse unveränderlich sein sollte, wenn beide überschrieben werden.
public class Point {
public override bool Equals (object other) {
var otherPoint = other as Point;
return this == otherPoint;
}
//must override GetHashCode() as well
public static bool operator == (Point l, Point r) {
if (Object.ReferenceEquals(l, null) && Object.ReferenceEquals(r, null))
return true;
if (Object.ReferenceEquals(l, null) || Object.ReferenceEquals(r, null))
return false;
//actual equality checks
}
public static bool operator != (Point l, Point r) {
return !(l==r);
}
}