अद्यतन का मूल्यांकन करना चाहिए है: यह सवाल the subject of my blog on May 27th 2010 था। महान सवाल के लिए धन्यवाद!
यहां बहुत सारे भ्रमित उत्तर हैं। मुझे अपने प्रश्न का सही जवाब देने की कोशिश करें। आइए इसे सरल बनाएं:
object value = whatever;
bool condition = something;
decimal result = (decimal)(condition ? value : 0);
कंपाइलर अंतिम पंक्ति की व्याख्या कैसे करता है? संकलक द्वारा सामना की जाने वाली समस्या यह है कि सशर्त अभिव्यक्ति का प्रकार दोनों शाखाओं के लिए सुसंगत होना चाहिए; भाषा नियम आपको एक शाखा पर वस्तु को वापस करने की अनुमति नहीं देते हैं और दूसरे पर int। विकल्प वस्तु और int हैं। प्रत्येक int ऑब्जेक्ट में परिवर्तनीय है लेकिन हर ऑब्जेक्ट int में परिवर्तनीय नहीं है, इसलिए कंपाइलर ऑब्जेक्ट चुनता है। इसलिए यह
decimal result = (decimal)(condition ? (object)value : (object)0);
इसलिए शून्य लौटा हुआ एक बॉक्सिंग int है।
फिर आप दशमलव को int को अनबॉक्स करते हैं। दशमलव पर बॉक्स किए गए int को अनबॉक्स करना अवैध है। कारण, उस विषय पर अपने ब्लॉग लेख देखें:
Representation and Identity
असल में, आपकी समस्या यह है कि आप कार्य कर रहे हैं जैसे कि दशमलव के कलाकारों वितरित किए गए, इस तरह है:
decimal result = condition ? (decimal)value : (decimal)0;
लेकिन जैसा कि हमने देखा है, यह
decimal result = (decimal)(condition ? value : 0);
का अर्थ है। इसका मतलब है "ऑब्जेक्ट्स में दोनों विकल्प बनाएं और फिर परिणामस्वरूप ऑब्जेक्ट को अनबॉक्स करें"।
result = (decimal)(valueFromDatabase != DBNull.Value ? (decimal)valueFromDatabase : (decimal)0);
कम से कम, एक ऐसी ही स्थिति मेरे लिए एक पैरामीटर में कास्टिंग: यदि आप संयुक्त दोनों
मैं यह स्पष्ट करना चाहता हूं कि पहले लोगों में शून्य का मूल्यांकन होता है, न कि DBNull.value पर। दशमलव को 0 कास्टिंग क्यों अपवाद फेंकता है? – Ioannis