c# - 重载相等运算符 == 如何真正起作用?

标签 c# null comparison operator-overloading equality

我在 MyClass 中有这段代码:

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

    // Other operations to check for equality
}

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

最佳答案

编辑

我是正确的。它确实以递归方式调用== 运算符(至少在LinqPad 4.5 中),而不是绑定(bind)到object.==。可以通过三种方法解决此问题:

  • 如果您确实需要 value 相等语义,则重载 Equals
  • lhsrhs 转换为object
  • 按照 MSDN 指南的建议使用 Object.ReferenceEquals

I suppose that comparison itself will invoke the overload function again

否 - null 不是 MyClass,因此调用使用 == 的默认含义,即引用相等。

另请注意 guidelines for overloading ==声明它只应为不可变类型重载,因为 == 的预期行为是引用相等性,这是默认情况下发生的情况。 Equals 表示“值相等”语义。

关于c# - 重载相等运算符 == 如何真正起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33262960/

相关文章:

c++ - 为什么 std::sort 将元素与自身进行比较

c# - 未调用基于单元测试的类中的 ClassInitialize 属性

c - 如何在套接字流缓冲区中添加空终止。 C

C# 使用 webbrowser 文档文本,文档保持为空

attributes - 如何在 jaxb 编码期间跳过空字段

php - 如何比较字符串中的版本号?

objective-c - 将 NSSet 中的对象与 NSArray 中的对象进行比较

c# - 删除资源字典中未使用的样式

C# DataGridView 在右键单击的位置打开 ContextMenu

c# - 在算法竞赛中不使用 BigInteger 库处理大整数