C#重载运算符==

Rac*_*acs 2 c#

//overloading operator ==
class Point
{
    private int m_X,int m_Y;

    public static operator == (Point p1 ,Point p2)
    {
        if(object.ReferenceEquals(p1,p2)
            return true;

        if((object)(p1) == null) || ((object)(p2) ==null)
            return false;

        return( (p1.x == p2.x) && (p1.x == p2.x));
    }

    //overloading the != operator
}
Run Code Online (Sandbox Code Playgroud)
  1. 是否有必要覆盖Equals功能
  2. 如果p1和p2没有被类型转换为对象,则抛出堆栈溢出异常为什么我们需要将Point对象强制转换为对象.

Kei*_*thS 6

  1. 如果重载==运算符,通常优先覆盖Equals()方法,因为它们应返回相同的结果,如果不覆盖它,Object.Equals()将推迟到ReferenceEquals(),因此运算符和方法将有不同的结果.这样做的简单方法是让操作符调用Equals()方法(它应该具有与此处类似的代码)

  2. 您必须强制转换为Object才能执行== null比较,因为您处于重载的==方法中,因此如果没有强制转换为基类型,您的运算符方法会无休止地调用它来尝试评估是否p1 == null.