2013-05-29 160 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