Имеет смысл, если этот код находится внутри Object.Equals
переопределения, и вы не хотите вызывать оператор равенства (который может, например, ошибочно вызвать Equals
). Приведение к объекту позволяет вызвать стандартный оператор равенства, который сравнивает ссылки.
Обычно вы используете Object.ReferenceEquals
для сравнения экземпляра объекта с null
внутри Equals
переопределения.
Например, это может привести к переполнению стека:
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;
}
}
В приведенном выше примере оператор равенства вызывает Equals
, и поскольку переменная otherPoint
имеет тип Point
, она вызовет оператор равенства, что приведет к бесконечной рекурсии.
Обычно, когда вы переопределяете Equals
и определяете оператор равенства, вы помещаете логику сравнения в оператор и вызываете ее из переопределения Equals
. Помните, что для класса рекомендуется быть неизменным, если оба они переопределены.
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);
}
}