2015-01-08 7 views
5

मुझे नहीं लगता कि मैं समझता हूं कि पहला कथन true का मूल्यांकन क्यों करता है और अंतिम विवरण false पर मूल्यांकन करता है, लेकिन यह एक लंबा दिन रहा है।ऑब्जेक्ट पर डालने पर 0L बराबर 0 क्यों नहीं है?

क्या कोई इसे समझा सकता है?

0L.Equals(0) // true 
((object)0L).Equals(0L) // true 
((object)0L).Equals(0) // false 
+0

मुझे लगता है कि असली मुद्दा "0" बनाया जा रहा है, और आपकी कास्टिंग प्रत्येक बार विभिन्न भिन्नताओं को चुनने के लिए बना रही है। – BradleyDotNET

उत्तर

13

Object.Equals ऑब्जेक्ट एक मान प्रकार है जो पहले प्रकार की तुलना करता है। दोनों इस मामले में अलग हैं।

MSDN: मूल्य समानता के लिए

वर्तमान उदाहरण एक मान प्रकार है, तो बराबर (वस्तु) विधि परीक्षण। मूल्य समानता का अर्थ निम्न है: दो ऑब्जेक्ट्स एक ही प्रकार के हैं। जैसा कि निम्न उदाहरण दिखाता है, एक बाइट ऑब्जेक्ट जिसमें 12 का मान है, वह Int32 ऑब्जेक्ट के बराबर नहीं है जिसमें 12 का मान है, क्योंकि दोनों ऑब्जेक्ट्स में अलग-अलग रन-टाइम प्रकार होते हैं।

+2

यह समझने के लिए कि यह मामला क्यों है, किसी को मुक्केबाजी को समझने की जरूरत है। संरचनाओं में संदर्भ प्रकारों की तरह विरासत नहीं होती है: 'ऑब्जेक्ट' एक ही अर्थ में आधार वर्ग नहीं है कि यह संदर्भ प्रकारों के लिए है - 'ऑब्जेक्ट' को मान-प्रकार कास्टिंग करना वास्तव में 'ऑब्जेक्ट' उदाहरण के अंदर मान को लपेटता है । किसी संदर्भ प्रकार के लिए 'Int64' के ओवरराइड' बराबर 'को तब भी बुलाया जाएगा, भले ही आपने' ऑब्जेक्ट 'पर उदाहरण डाला हो। –

+0

ठीक है, बॉक्स किए गए Int64 ऑब्जेक्ट सीधे Int64 के बराबर विधि का उपयोग नहीं करता है। मेरी राय यह है कि अगर यह किया तो यह अच्छा होगा, लेकिन मुझे लगता है कि ऐसा क्यों नहीं हो सकता है। – ken

+0

@ken: मूल्य प्रकार संदर्भ प्रकार नहीं हैं भले ही वे बॉक्स किए गए हों। एक तरफ के रूप में: वे व्यवहार करते हैं जैसे कि जब आप उन्हें 'बराबर' के बजाय '==' के साथ तुलना करते हैं और 'झूठी' वापस लौटाते हैं, भले ही मान बराबर लगता है:' ((वस्तु) 0 एल) == (वस्तु) 0 एल) // झूठी'। ऐसा इसलिए है क्योंकि मुक्केबाजी नई वस्तुओं और '==' तुलना संदर्भ समानता बनाता है। –

0
((object)0L).Equals(0) 

यहाँ आप पूर्णांक एक प्रकार की वस्तु का एक प्रकार की तुलना कर रहे (न पर पूर्णांक यह एक और संख्यात्मक प्रकार हो सकता है मुझे बोली)

प्रकार अलग हैं।

+0

नहीं कि मैं आपके तर्क से असहमत हूं, लेकिन यह पहले उदाहरण से अलग क्यों होगा? – BradleyDotNET

+0

'एल' का अर्थ है कि यह एक 'लंबा (Int64)' या' ulong' (आकार के आधार पर) है। – Tim

+0

@tim किस प्रकार 0 लेता है? – Buck3y3

0
0L.Equals(0) // true 

यह long.Equals विधि है, जो एक long एक पैरामीटर के रूप में स्वीकार करता करने के लिए हल करता है। int पर पैरामीटर के लिए प्रदान की गई वास्तविक अभिव्यक्ति। int को long पर स्पष्ट रूप से परिवर्तित किया गया है, इसलिए long0 पारित किया गया है, जो अन्य मान के बराबर है।

((object)0L).Equals(0L) // true 
((object)0L).Equals(0) // false 

मुक्केबाजी long यहाँ long.Equals अधिभार के उपयोग से बचाता है, और केवल object.Equals अधिभार, जो एक object पैरामीटर स्वीकार करता है छोड़ देता है। चूंकि पैरामीटर object दोनों स्निपेट्स हैं, प्रत्येक में क्रमशः long और int है, दोनों बॉक्सिंग प्राप्त करते हैं। object.Equals कार्यान्वयन भी पैरामीटर के प्रकार की जांच करता है और विभिन्न प्रकार के किसी भी ऑब्जेक्ट को बराबर नहीं मानता है। इन दो स्निपेट्स में से पहला चेक पास करता है, जिस बिंदु पर यह मानों की जांच करने के लिए चला जाता है, उन्हें बराबर लगता है। दूसरा स्निपेट चेक विफल रहता है, जिसके परिणामस्वरूप false होता है।

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