当重载"=="操作符时出现无限递归

4

我有一个在c#中想要重载“==”运算符的类。我已经有了一个有效的.Equals覆盖。当我试图使用我的“==”运算符时,它给我的对象(Person)抛出一个空引用异常。如果我尝试检查它是否为空,它会调用相同的运算符来将其与null进行比较并创建无限循环。这似乎是一个巨大的缺陷,我找不到正确的方法来解决它。

public static bool operator ==(Person person, object obj)
{
    return person == null ? person.Equals(obj) : false;
}

public static bool operator !=(Person person, object obj)
{
    return !(person == obj);
}

应该是 return person != null ? person.Equals(obj) : false; - vc 74
null 进行比较时,应使用 !object.ReferenceEquals(person, null) 来确保(并明确!)您正在检查引用相等性。 - dlev
1个回答

9

第三个选项是使用静态的 object.Equals(person, null) 方法。 - Servy
1
@Servy:虽然那样做可以工作,但那是利用了object.Equals的实现细节。调用ReferenceEquals总是做正确的事情,并且易于阅读和理解,所以那将是我的首选解决方案。 - Eric Lippert
@EricLippert 如果它被文档记录为这样的话,你能称它为实现细节吗?“它确定两个对象是否表示相同的对象引用。如果是,则该方法返回true。此测试等效于调用ReferenceEquals方法。此外,如果objAobjB都为null,则该方法返回true。”虽然我同意ReferenceEquals()更清晰。 - svick
@svick:你说得很对;你可以依赖于 object.Equals 来首先进行引用相等性比较。 - Eric Lippert
1
哦,我的天啊,Eric Lippert 评论了我的回答。我甚至不在乎他是在回复别人的评论。我要休息一整天。 - Ryan M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接