2013-04-18 9 views
7

तुलना क्यों निम्नलिखित कोड का टुकड़ा देता है 1:NaN और अशक्त रिटर्न illogic मूल्य

double i = double.NaN; 
double? i2 = null; 
i.CompareTo(i2); 

देखने की मेरी बात यह कोई मतलब नहीं है से। एक अपवाद अधिक उपयुक्त होगा।

निर्णय के पीछे तर्क क्या था आपको क्या लगता है।

+4

सॉर्ट करते समय यह सभी नल और नैन को किसी सूची के शीर्ष या निचले हिस्से में मजबूर करता है। नल और नैन सॉर्ट करने में "भावना" बिल्कुल ठीक है जैसा आप कहते हैं: एक बिंदु। मुझे लगता है कि इसे संभालने के लिए सुरक्षित था क्योंकि 'आईसीओएमपेयर/आईसीओम्पेर्बल' पृष्ठभूमि में बहुत सी चीजें चलाता है, और यदि उपयोगकर्ता अलग-अलग व्यवहार चाहते हैं तो अधिकांश समय उपयोगकर्ता द्वारा ओवरराइड किया जा सकता है। –

+1

कुछ भी कुछ भी बेहतर नहीं है। –

उत्तर

2

MSDN प्रलेखीकरण से IComparable.CompareTo() पर:

परिभाषा के अनुसार, किसी भी वस्तु से अधिक तुलना (या इस प्रकार) अशक्त, और दो अशक्त संदर्भ एक दूसरे के बराबर की तुलना करें।

यह भी Double.CompareTo(object) दस्तावेज़ से स्पष्ट है:

एक सकारात्मक पूर्णांक रिटर्न, तो यह उदाहरण के मूल्य से अधिक है। -या- यह उदाहरण एक संख्या है और मान एक संख्या (NaN) नहीं है। -या-मान एक शून्य संदर्भ है (विजुअल बेसिक में कुछ भी नहीं)।

एडम Houldsworth के रूप में बताते हैं, अगर something.CompareTo(somethingElse) एक अपवाद फेंक दिया जब somethingElse रिक्त है, तो छंटाई और कि तरह बातें अतिरिक्त अपवाद संचालन के बहुत सारे की आवश्यकता होगी।

4

प्रलेखन से CompareTo पर:

मूल्य पैरामीटर नल या डबल का एक उदाहरण होना चाहिए; अन्यथा, एक अपवाद फेंक दिया गया है। इसके मान के बावजूद डबल का कोई भी उदाहरण शून्य से अधिक माना जाता है।

आपके उदाहरण में मान पैरामीटर null है। NaN इसलिए शून्य से अधिक माना जाता है, इसलिए CompareTo सही ढंग से 1 देता है।

2

जब आप डिकंपाइल double की CompareTo, जैसा कि आप देख सकते हैं:

public int CompareTo(object value) 
{ 
    if (value == null) 
    return 1; 

बस किसी भी क्रमबद्ध अनुक्रम के तल पर अशक्त तत्वों डाल करने के लिए।

संबंधित मुद्दे