Сравнение двух объектов на эквивалентность - C#
Формулировка задачи:
Есть такой код (часть):
В результате получаю ошибку переполнения стека. Не ожидал, что для сравнения с null вызовется оператор.
Как лучше всего разорвать эту петлю?
static void Main(string[] args)
{
Point p1 = new Point();
Point p2 = new Point(5);
Object o1 = new Point(5);
Console.WriteLine(o1.Equals(p2)); // проблема возникает тут
}
class Point : IComparable, IComparable<Point>, IComparer<Point>
{
private int x;
private int y;
private double vector;
public Point(int x, int y)
{
this.x = x;
this.y = y;
vector = Math.Sqrt(x * x + y * y);
}
public Point(int xy) : this(xy, xy) { }
public Point() : this(0, 0) { }
public override bool Equals(object obj)
{
Point other = obj as Point;
if (this == null && other == null) // тут происходит вызов оператора класса "=="
return true;
if (other == null)
return false;
else
{
if (x == other.x && y == other.y)
return true;
}
return false;
}
public override int GetHashCode()
{
return (int)vector ^ (x | y);
}
public static bool operator ==(Point point1, Point point2)
{
if (point1 == null & point2 == null) // в операторе вызывается Equals()
return true;
if (point2 != null)
return false;
return point1.Equals(point2);
}
public static bool operator !=(Point point1, Point point2)
{
return point1.Equals(point2);
}
public static bool operator >(Point point1, Point point2)
{
if ((point1.vector > point2.vector) || (point1.vector == point2.vector && point1.x > point2.x)
|| (point1.vector == point2.vector && point1.x == point2.x && point1.y > point2.y))
return true;
return false;
}
public static bool operator <(Point point1, Point point2)
{
return !(point1 > point2);
}
}
}Решение задачи: «Сравнение двух объектов на эквивалентность»
textual
Листинг программы
if (ReferenceEquals(point1, null) && ReferenceEquals(point2, null)