कंपाइलर दाएं हाथ के प्रकार को समझते समय बाएं हाथ की ओर इशारा करता है। इसलिए, जब
Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar)
के प्रकार के अनुमान की कोशिश करता है यह बहुत तथ्य यह है के लिए किसी भी ध्यान दे बिना बाएं हाथ की ओर एक long?
है करता है। दाएँ हाथ की ओर के प्रकार यह कहा गया है कि
Int64.Parse(myOtherVar)
एक long
है और अब अगर null
है या परोक्ष एक long
में बदला जा सकता है देखने के लिए कोशिश करता है निर्धारित करने के लिए। चूंकि यह नहीं हो सकता है, आपको त्रुटि संदेश मिलता है जो आप देखते हैं।
रूप b ? x : y
....
दूसरे और तीसरे ऑपरेंड, x
और y
की सशर्त अभिव्यक्ति, ?:
ऑपरेटर नियंत्रण के प्रकार:
सी # विनिर्देश के §7.14 से
सशर्त अभिव्यक्ति का।
(1) X
टाइप x
है और y
टाइप Y
तो
एक है। यदि एक अंतर्निहित रूपांतरण (§6.1) X
से Y
से मौजूद है, लेकिन Y
से X
पर नहीं है, तो Y
सशर्त अभिव्यक्ति का प्रकार है।
बी। यदि एक अंतर्निहित रूपांतरण (§6.1) Y
से X
से मौजूद है, लेकिन X
से Y
पर नहीं है, तो X
सशर्त अभिव्यक्ति का प्रकार है।
सी। अन्यथा, कोई अभिव्यक्ति प्रकार निर्धारित नहीं किया जा सकता है, और संकलन-समय त्रुटि उत्पन्न होती है।
(2) यदि x
और y
का केवल एक ही एक प्रकार है, और दोनों x
और y
, areimplicitly उस प्रकार के लिए परिवर्तनीय की, तो वह सशर्त अभिव्यक्ति का प्रकार है।
(3) अन्यथा, कोई अभिव्यक्ति प्रकार निर्धारित किया जा सकता है, और एक संकलन समय त्रुटि उत्पन्न होती है।
ध्यान दें कि हम स्थिति में हैं (2) जहां x
null
है और एक प्रकार नहीं है और y
Int64.Parse(myOtherVar)
है और long
टाइप करें। ध्यान दें कि x
y
के प्रकार के लिए पूरी तरह से परिवर्तनीय नहीं है। इसलिए दोनों (1) और (2) ऊपर विफल हो जाते हैं और हम परिणामस्वरूप (3) जिसके परिणामस्वरूप संकलन-समय त्रुटि होती है जो आपके प्रश्न को प्रेरित करती है। उपर्युक्त से अंतर्निहित निष्कर्ष पर ध्यान दें कि बाईं ओर की ओर दाएं हाथ के प्रकार को निर्धारित करने में भूमिका निभाई नहीं जाती है।
क्योंकि संकलक वहाँ जानता है इस
(long?)Int64.Parse(myOtherVar)
के साथ बदलें
Int64.Parse(myOtherVar)
अब कारण के रूप में long?
है सुधारने के लिए, क्यों
myVar = null;
ठीक है जहां myVar
घोषित किया जाता है 012 से एक अंतर्निहित रूपांतरण हैसे long?
।
आखिरकार, Int64.Parse
फेंक देगा अगर myOtherVar
को long
पर पार्स नहीं किया जा सकता है। ध्यान दें कि आप दो बार पार्स भी कर रहे हैं, जो अनावश्यक है। एक बेहतर पैटर्न
long value;
if(Int64.TryParse(myOtherVar, out value)) {
myVar = value == 0 ? null : (long?)value;
}
else {
// handle case where myOtherVar couldn't be parsed
}
अजीब तरह, Int64.Parse (myOtherVar) == 0 कोशिश? (लंबा?) शून्य: Int64.Parse (myOtherVar); काम करता है। –
अच्छा आउट वैरिएबल उपयोग। –
यह वास्तव में अच्छा होगा अगर किसी एक्सेसर में "मान" जैसा कुछ था, जहां आप कथन के भीतर एक अस्थायी चर बना सकते हैं। –