重载等于运算符==如何真正起作用?

afa*_*lek 3 c# comparison null equality operator-overloading

我有这段代码MyClass:

public static bool operator ==(MyClass lhs, MyClass rhs)
{
    if (lhs == null || rhs == null)
        return false;

    // Other operations to check for equality
}
Run Code Online (Sandbox Code Playgroud)

第一行代码中去,我比较lhsrhsnull.我不确定,但我想比较本身会再次调用重载函数.然后我们又回到那条线上,它会调用自己,等等.无限递归的排序.
但我们都知道不会发生这种情况.在我看来,这意味着与null不调用相等重载相比.那真的发生了什么?与null工作比较如何?

D S*_*ley 5

编辑

我纠正了.它确实==递归方式调用运算符(至少在LinqPad 4.5中),而不是绑定到object.==.有三种方法可以解决这个问题:

  • Equals如果你真的想要相等语义,那么 重载.
  • 铸造lhsrhsobject
  • 使用Object.ReferenceEquals作为MSDN指南推荐

我想比较本身会再次调用重载函数

否 - null不是,MyClass所以调用使用默认含义==是引用相等.

还要注意,重载==指导原则是它应该只为不可变类型重载,因为预期的行为==是引用相等,这是默认情况下发生的. Equals意味着"价值平等"的语义.