c# 2.0 - C# ?: Conditional Operator -
मेरे पास सी # 2.0 स्रोत कोड का यह उद्धरण है
ऑब्जेक्ट मान FromDatabase; दशमलव परिणाम; ValueFromDatabase = DBNull.Value; परिणाम = (दशमलव) (valueFromDatabase! = DBNull.Value? ValueFromDatabase: 0); परिणाम = (valueFromDatabase! = DBNull.Value? (दशमलव) valueFromDatabase: (दशमलव) 0);
पहला परिणाम मूल्यांकन एक अवैध कलाकार अपवाद फेंकता है जबकि दूसरा नहीं है। इन दोनों के बीच अंतर क्या है?
अद्यतन: यह प्रश्न था। महान प्रश्न के लिए धन्यवाद!
यहां बहुत सारे भ्रामक उत्तर दिए गए हैं। मुझे अपने प्रश्न का उत्तर देने का प्रयास करने दो। आइये इसे सरल करें:
वस्तु का मूल्य = जो भी; बूल की स्थिति = कुछ; दशमलव परिणाम = (दशमलव) (स्थिति? मान: 0);
कंपाइलर अंतिम पंक्ति की व्याख्या कैसे करता है? संकलक द्वारा सामना की जाने वाली समस्या यह है कि सशर्त अभिव्यक्ति का प्रकार दोनों शाखाओं के लिए संगत होना चाहिए ; भाषा के नियम आपको किसी एक शाखा और दूसरे पर आदान-प्रदान करने की अनुमति नहीं देते हैं विकल्प ऑब्जेक्ट और इंट हैं हर इंट ऑब्जेक्ट के लिए परिवर्तनीय है, लेकिन हर ऑब्जेक्ट int को परिवर्तनीय नहीं है, इसलिए कंपाइलर ऑब्जेक्ट चुनता है। इसलिए यह वही है जैसे
दशमलव परिणाम = (दशमलव) (स्थिति? (वस्तु) मान: (ऑब्जेक्ट) 0);
इसलिए शून्य लौटा एक बॉक्सिंग int है
आप फिर दशमलव को int को अनबॉक्स करें यह गैरकानूनी है कि दशमलव के लिए एक बॉक्सिड इंट बेक। कारणों से, उस विषय पर मेरा ब्लॉग लेख देखें:
असल में, आपकी समस्या यह है कि आप अभिनय कर रहे हैं जैसे कि दशमलव को डाली गई, इस तरह से: < / P> <पूर्व> दशमलव परिणाम = स्थिति? (दशमलव) मान: (दशमलव) 0;
लेकिन जैसा हमने देखा है, ऐसा नहीं है कि
दशमलव परिणाम = (दशमलव) (शर्त? मान: 0);
इसका मतलब है। इसका अर्थ है "ऑब्जेक्ट्स में दोनों विकल्प बनाते हैं और फिर परिणामी ऑब्जेक्ट को अनबॉक्स बनाते हैं।"
Comments
Post a Comment