Tiene sentido si ese código está dentro de Object.Equals
y no desea invocar al operador de igualdad (que podría, por ejemplo, llamar erróneamente al Equals
). Casting to object permite llamar al operador de igualdad estándar, que compara las referencias.
Normalmente, se usaría Object.ReferenceEquals
comparar una instancia de un objeto a null
dentro Equals
anulación.
Por ejemplo, esto podría causar un desbordamiento de pila:
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;
}
}
En el operador de igualdad ejemplo anterior llama Equals
y debido otherPoint
variable es de tipo Point
, sería invocar el operador de igualdad, haciendo que la recursividad infinita.
Normalmente, cuando se reemplaza Equals
y se define el operador de igualdad, que pondría a la lógica de comparación en el operador e invocar que a partir de la anulación Equals
. Tenga en cuenta que se recomienda que la clase sea inmutable si ambas se anulan.
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);
}
}
No necesita hacerlo. – ChrisF
Estoy esperando que él diga que así es como su maestro dijo que lo hiciera o algo :) – Earlz
Bien, pero ... http://msdn.microsoft.com/en-us/library/ms173147(VS.80) .aspx –