2008-12-01 17 views
104

के बारे में बताएं कि क्यों एक नल पूर्णांकC# क्यों एक नल पूर्णांक एक मूल्य

int? accom = (accomStr == "noval" ? null : Convert.ToInt32(accomStr)); 

क्या है कि कोड के साथ गलत क्या है अशक्त, उदा का मूल्य नहीं सौंपा जा सकता है के रूप में अशक्त नहीं सौंपा जा सकता है?

उत्तर

207

समस्या यह नहीं है कि शून्य को int को असाइन नहीं किया जा सकता है? समस्या यह है कि टर्नरी ऑपरेटर द्वारा लौटाए गए दोनों मान एक ही प्रकार के होने चाहिए, या किसी को दूसरे के लिए पूरी तरह से परिवर्तनीय होना चाहिए। इस मामले में, शून्य को अंतर्निहित रूप से int और इसके विपरीत में परिवर्तित नहीं किया जा सकता है, इसलिए एक अन्वेषण कास्ट आवश्यक है। ऐसा करें:

int? accom = (accomStr == "noval" ? (int?)null : Convert.ToInt32(accomStr)); 
+3

यह दिलचस्प है - आप वास्तव में Convert.ToInt32 के लिए कलाकारों की जरूरत नहीं है ... –

+1

यह क्योंकि System.Int32 = System.Nullable

+1

क्यों लंबे करता है! ? कलाकार के बिना काम? –

36

क्या हैरी एस का कहना है बिल्कुल सही है, लेकिन

int? accom = (accomStr == "noval" ? null : (int?)Convert.ToInt32(accomStr)); 

भी चाल करना होगा। (हम ReSharper उपयोगकर्ताओं को हमेशा भीड़ में एक दूसरे को देखा जा सकता है ...)

+1

अब यह अच्छा है, यह सिर्फ एक सूक्ष्म अंतर है लेकिन इतना आसान है! +2 अगर मैं कर सकता था (यह थोड़ी सी बात होने के बावजूद) =) – Coops

5

एक अन्य विकल्प

int? accom = (accomStr == "noval" ? Convert.DBNull : Convert.ToInt32(accomStr); 

उपयोग करने के लिए मैं इस एक सबसे अधिक पसंद है।

+0

क्या आप वास्तव में यह कोशिश करते थे? यह त्रुटि देनी चाहिए "टाइप 'ऑब्जेक्ट' को 'int' में रूपांतरित नहीं कर सकता है। एक स्पष्ट रूपांतरण मौजूद है (क्या आप एक कास्ट गायब हैं?)" –

1

इसी तरह मैं लंबे समय के लिए किया था:

myLongVariable = (!string.IsNullOrEmpty(cbLong.SelectedItem.Value)) ? Convert.ToInt64(cbLong.SelectedItem.Value) : (long?)null; 
संबंधित मुद्दे