2015-05-13 4 views
8

में निम्न के लिए जांचें निम्नलिखित सी # स्निपेट में मैं == विधि को ओवरराइड करता हूं। _type कई प्रकार के short है। तो मैं वास्तव में कह रहा हूं कि दो WorkUnitType एस वही हैं जब उन दो short एस समान हैं।== ओवरराइड

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (type1 == null || type2 == null) 
     return false; 
    return type1._type == type2._type; 
} 

क्योंकि आर # मुझे चेतावनी देते हैं, और यह पूरी तरह स्पष्ट नहीं है कि, कि type1/type2 संभावित अशक्त हो सकता है मैं ऊपर if बयान के साथ कि पकड़ने के लिए कोशिश कर रहा हूँ है।

अब मुझे StackOverflowException मिल रहा है जो पूरी तरह से समझ में आता है क्योंकि मैं वास्तव में ओवरराइड को कॉल कर रहा हूं।

प्रश्न: मैं इस विधि को "सही" कैसे लिखूं। मैं इस मामले को कैसे पकड़ सकता हूं कि type1 या type2null हो सकता है?

मेरे सर्वोत्तम अनुमान: हो सकता है कि मैं सिर्फ यहाँ == का दुरुपयोग कर रहा हूँ और समानता के लिए जाँच Equals ओवरराइड के साथ किया जाना चाहिए। लेकिन फिर भी मुझे लगता है कि समस्या मौजूद है। तो तर्क में मेरी त्रुटि कहां है?

उत्तर

9

आप ReferenceEquals() फ़ंक्शन की तलाश में हैं, जो आपके ऑपरेटर ओवरलोड को सीधे छोड़कर सीधे तुलना करेगा।

+0

मुझे नहीं पता था कि 'ReferenceEquals' मौजूद है। यह वास्तव में जवाब है। धन्यवाद। – Stephan

2

स्लाक्स ने जो कहा, इसके अतिरिक्त, यदि आप दोनों शून्य के बराबर हैं तो भी आप सच वापस लौटना चाहते हैं। तो, इस तरह:

public static bool operator ==(WorkUnitType type1, WorkUnitType type2) 
{ 
    if (ReferenceEquals(type1, null)) 
     return ReferenceEquals(type2, null); 

    if (ReferenceEquals(type2, null)) 
     return false; 

    return type1._type == type2._type; 
} 
1

पूर्णता 'खातिर: आप भी दो तर्क object पर कास्ट कर सकते। यह object में परिभाषित कार्यान्वयन का उपयोग करेगा, न कि आपके कस्टम एक।

कोड में:

if ((object) type1 == null || (object) type2 == null) 
संबंधित मुद्दे