2010-11-27 15 views
11

यह एक There is no implicit conversion between 'null' and 'int'टर्नरी ऑपरेटर में शून्य क्यों असाइन करना विफल रहता है: शून्य और int के बीच कोई अंतर्निहित रूपांतरण नहीं?

long? myVar = Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar); 

हालांकि साथ विफल रहता है, यह सफल होता है:

if(Int64.Parse(myOtherVar) == 0) 
    myVar = null; 
else 
    myVar = Int64.Parse(myOtherVar); 

वहाँ त्रिगुट ऑपरेटर सफल होने बनाने के लिए एक तरीका है?

उत्तर

25

कंपाइलर दाएं हाथ के प्रकार को समझते समय बाएं हाथ की ओर इशारा करता है। इसलिए, जब

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) जहां xnull है और एक प्रकार नहीं है और yInt64.Parse(myOtherVar) है और long टाइप करें। ध्यान दें कि xy के प्रकार के लिए पूरी तरह से परिवर्तनीय नहीं है। इसलिए दोनों (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 
} 
+0

अजीब तरह, Int64.Parse (myOtherVar) == 0 कोशिश? (लंबा?) शून्य: Int64.Parse (myOtherVar); काम करता है। –

+0

अच्छा आउट वैरिएबल उपयोग। –

+0

यह वास्तव में अच्छा होगा अगर किसी एक्सेसर में "मान" जैसा कुछ था, जहां आप कथन के भीतर एक अस्थायी चर बना सकते हैं। –

2

आपका ऑपरेटर उपयोग Int64 लौटा रहा है, न कि nullable एक, टर्नरी ऑपरेटर के अंतिम भाग की वजह से। यह काम कर सकते हैं, तो आप के बजाय कार्य करें:

long? myVar = Int64.Parse(myOtherVar) == 0 ? null : 
    (long?)Int64.Parse(myOtherVar); 

तो तुम में एक long? लौट रहे हैं बजाय, इसलिए nullInt64

इसके अलावा करने के लिए परिवर्तित करने की आवश्यकता नहीं है, आप मूल्य परिवर्तित कर रहे हैं दो बार है कि आपके कोड, अनावश्यक रूप से (एक बार परीक्षण करने के लिए, और एक बार मूल्य प्राप्त करने के लिए)। आपका कोड बेहतर हो सकता है:

long? tempVar = Int64.Parse(myOtherVar); 
long? myVar = tempVar==0? null : tempVar; 
2

है मुझे यकीन है कि आप कहते हैं कि करने के लिए होती हूँ:

myVar = value == 0 ? null : (long?)value; 

बजाय

की
myVar = value == 0 ? null : value; 

मैं 'बाहर' चर का उपयोग पसंद आया। धन्यवाद।

0

यह काम करेगा:

long? myVar = (long?)myOtherVar == 0 ? null : (long?)myOtherVar; 

जो कम जवाब उन ..for।

0

संकलक सही

long? myVar = Int64.Parse(myOtherVar) == 0 ? null : Int64.Parse(myOtherVar); 

int64.parse विधि बाएं से एक long मूल्य एक nullable लंबे मूल्य नहीं लौट भाव का मूल्यांकन करने की कोशिश करता है।इसलिए null और Int64.Parse(myOtherVar); तो दोनों के बीच कोई रूपांतरण नहीं है, यह एक

long? myVar = Int64.Parse(myOtherVar) == 0 ? (long?) null : Int64.Parse(myOtherVar); 

या
long? myVar = Int64.Parse(myOtherVar) == 0 ? null : (long?) Int64.Parse(myOtherVar);

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