2013-05-29 113 views
4

我有一个类,我想重载在c#中的==运算符。我已经有一个.Equals覆盖,正常工作。当我尝试使用我的==运算符时,它在我的对象(Person)上给了我一个空引用异常。如果我试图检查它是否为null,它将依次调用相同的运算符来检查它是否为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); 
} 
+0

不应该是return person!= null? person.Equals(obj):false; –

+0

与'null'比较时,应该使用'!object.ReferenceEquals(person,null)'来确保(并明确表示)你正在检查引用的相等性。 – dlev

+0

是的,你是对的谢谢 – viper110110

回答

8

使用(object)person == null,迫使它使用对象的==操作符(或使用ReferenceEquals)。见http://msdn.microsoft.com/en-us/library/ms173147(v=vs.80).aspx

+0

第三种选择是使用静态'object.Equals(person,null)'方法。 – Servy

+1

@Servy:虽然可行,但它利用了object.Equals的实现细节。调用'ReferenceEquals'总是做正确的事情,很容易阅读和理解,所以这将是我的首选解决方案。 –

+0

@EricLippert如果它是[文档](http://msdn.microsoft.com/en-us/library/w4hkze5k.aspx),你可以称它为实现细节吗? “它确定两个对象是否代表相同的对象引用。如果他们这样做,该方法返回'true'。这个测试相当于调用'ReferenceEquals'方法。另外,如果'objA'和'objB'都是'null',则方法返回'true'。“虽然我同意'ReferenceEquals()'更清晰。 – svick