2011-11-29 22 views
9

इनरएक्सप्शन शून्य होने पर यह एक शून्य संदर्भ अपवाद फेंक देगा।यह एक शून्य संदर्भ अपवाद क्यों फेंक देता है?

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

लेकिन यह ऐसा नहीं करेंगे:

String s = " inner exception: " + (e.InnerException == null ? "None" : e.InnerException.Message); 

ऊपर का निर्माण ठीक दोनों। मैं यह नहीं समझ सकता कि पूर्व क्या करने की कोशिश कर रहा है जिससे यह का मूल्यांकन कर सकेगा। वे बराबर क्यों नहीं हैं?

उत्तर

22

ऐसा इसलिए है क्योंकि आपका पहला कथन " inner exception: " + e.InnerException == null का मूल्यांकन true या false होने का है। यह लगभग ऑपरेटर प्राथमिकता है, यही कारण है कि दूसरे काम कोष्ठक (( और )) के कारण ठीक काम करता है।

See this reference for Operator Precedence+ ऑपरेटर का मूल्यांकन समानता == ऑपरेटर से पहले किया जाता है।

+0

यही कारण है कि गैर-स्पष्ट मामलों में ब्रैकेट को शामिल करना सबसे अच्छा है, इसलिए आपको ऑपरेटर की प्राथमिकता के बारे में सोचना नहीं है। – Malcolm

+0

@ मैल्कम मैं पूरी तरह से सहमत हूं। –

4

यह ऑपरेटर प्राथमिकता के कारण है, इस मामले में + ऑपरेटर == ऑपरेटर से अधिक प्राथमिकता है इसलिए आपको डिफ़ॉल्ट प्राथमिकता क्रम को ओवरराइड करने के लिए ब्रांड्स का उपयोग करने की आवश्यकता है ताकि कोड सही क्रम में निष्पादित किया जा सके।

आप सी # भाषा विनिर्देश में इसके बारे में सब पढ़ सकते हैं:

Operator precedence and associativity

एक अभिव्यक्ति एकाधिक ऑपरेटर होते हैं, ऑपरेटरों की पूर्वता जिस क्रम में अलग-अलग ऑपरेटरों का मूल्यांकन कर रहे हैं को नियंत्रित करता है ।

3

यह:

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

शायद इस तरह मूल्यांकन किया जा रहा है:

String s = (" inner exception: " + e.InnerException) == null ? "None" : e.InnerException.Message; 
2

आपरेशन के आदेश:

String s = " inner exception: " + e.InnerException == null ? "None" : e.InnerException.Message; 

(" inner exception: " + e.InnerException) == null ? के रूप में मूल्यांकन किया जाता है जो यह नहीं है।

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