दिलचस्प पोस्ट
जावा 8 की धाराएं: क्यों समानांतर धारा धीमी है? विशिष्ट एक्सटेंशन के साथ सभी फाइलों को ढूंढने और बदलने के लिए PowerShell स्क्रिप्ट TypeError: console.log (…) फ़ंक्शन नहीं है स्काला में कई पैरामीटर सूचियों और प्रति सूची में कई मापदंडों के बीच क्या अंतर है? एंड्रॉइड: OpenSL ES का उपयोग कर संगीत की प्लेबैक दर को कैसे बदलना है NSString को NSArray सीएसएस में = "ईमेल" के लिए लेबल का चयन कैसे करें? लिनक्स प्रोग्राम को पाइपिंग डेटा जो एक टीटीआई (टर्मिनल) CGFloat और फ्लोट के बीच क्या अंतर है? मैं कोको टच के साथ सप्ताह के दिन कैसे प्राप्त करूं? कैसे पता लगा सकता है कि मेरी खोल स्क्रिप्ट पाइप के माध्यम से चल रही है? वेबकिट-ट्रांसफॉर्म क्रोम 13 में z- इंडेक्स ऑर्डरिंग को ओवरराइट करता है मैं एक डिस्प्ले कैसे बना सकता हूं: फ्लेक्स कंटेनर अपनी लिपटे हुई सामग्रियों के साथ क्षैतिज रूप से फैलता है? विंडोज़ को पीएचपी / आईआईएस के साथ लॉग इन कैसे करें कैसे nginx के कैश को साफ करने के लिए?

अशक्त प्रकार और टर्नरी ऑपरेटर: क्यों `? 10: शून्य 'मना किया?

मैं सिर्फ एक अजीब त्रुटि भर आया:

private bool GetBoolValue() { //Do some logic and return true or false } 

फिर, एक और विधि में, ऐसा कुछ:

 int? x = GetBoolValue() ? 10 : null; 

सरल, यदि विधि सत्य रिटर्न करती है, तो शून्य के लिए 10 को असाइन करें अन्यथा, nullable int के लिए रिक्त असाइन करें हालांकि, संकलक शिकायत करता है:

त्रुटि 1 सशर्त अभिव्यक्ति का प्रकार निर्धारित नहीं किया जा सकता क्योंकि int और <null> बीच कोई अंतर्निहित रूपांतरण नहीं है।

क्या मैं पागल हो रहा हूँ?

Solutions Collecting From Web of "अशक्त प्रकार और टर्नरी ऑपरेटर: क्यों `? 10: शून्य 'मना किया?"

संकलक पहले दाहिने हाथ की अभिव्यक्ति का मूल्यांकन करने की कोशिश करता है:

 GetBoolValue() ? 10 : null 

10 int शाब्दिक ( int? नहीं है int? ) और null है, ठीक है, null । उन दोनों के बीच त्रुटि संदेश में कोई अंतर्निहित रूपांतरण नहीं है

यदि आप निम्न में से किसी एक को सही-हाथ अभिव्यक्ति बदलते हैं, तो यह संकलित होता है क्योंकि int? बीच एक अंतर्निहित रूपांतरण होता है int? और null (# 1) और अंतर और int? बीच int? (# 2, # 3)

 GetBoolValue() ? (int?)10 : null // #1 GetBoolValue() ? 10 : (int?)null // #2 GetBoolValue() ? 10 : default(int?) // #3 

इसे इस्तेमाल करे:

 int? x = GetBoolValue() ? 10 : (int?)null; 

असल में यह क्या हो रहा है कि सशर्त ऑपरेटर अभिव्यक्ति के "वापसी प्रकार" को निर्धारित करने में असमर्थ है। चूंकि कंपाइलर ने तय किया है कि 10 एक int है, तब यह तय करता है कि इस अभिव्यक्ति का रिटर्न प्रकार एक int भी होगा। चूंकि एक int null नहीं हो सकता (सशर्त ऑपरेटर का तीसरा ऑपरेंटर) यह शिकायत करता है

एक null करने के लिए null कास्टिंग करके Nullable<int> हम संकलक को स्पष्ट रूप से बता रहे हैं कि इस अभिव्यक्ति का वापसी प्रकार एक Nullable<int> आप बस के रूप में आसानी से 10 लिए int? के रूप में अच्छी तरह से और एक ही प्रभाव पड़ा।

इसे इस्तेमाल करे:

int? result = condition ? 10 : default(int?);

संयोग से, सी # संकलक के माइक्रोसॉफ्ट का कार्यान्वयन वास्तव में सशर्त ऑपरेटर का प्रकार विश्लेषण बहुत ही सूक्ष्म और दिलचस्प (मेरे लिए) रास्ते में गलत हो जाता है उस पर मेरा लेख प्रकार अनुमान की स्थिति है, भाग एक

इनमें से किसी एक को आज़माएं:

 int? x = GetBoolValue() ? (int?)10 : null; int? x = GetBoolValue() ? 10 : (int?)null; 

समस्या यह है कि टर्नेरी ऑपरेटर आपके पहले पैरामीटर असाइनमेंट के आधार पर टाइपिंग कर रहा है … 10 इस मामले में, जो कि एक इंट है, नलएबल इंट नहीं है

आपके साथ बेहतर भाग्य हो सकता है:

 int? x = GetBoolValue() (int?)10 : null; 
 int? x = GetBoolValue() ? 10 : (int?)null; 

आप इसे देख रहे हैं, क्योंकि आप पर्दे के पीछे का उपयोग कर रहे हैं, और आपको सी # को बता देना चाहिए कि आपका "रिक्त" Nullable का एक नल उदाहरण है

सिर्फ एक विस्फोट डालना जोड़ें

 int? x = GetBoolValue() ? 10 : (int?)null; 

यह टर्नेरी ऑपरेटर है जो भ्रमित हो जाता है – दूसरा तर्क एक पूर्णांक है और ऐसा तीसरा तर्क है जो एक पूर्णांक हो, और भी शून्य हो।

इसका कारण यह है कि कंपाइलर द्वारा सशर्त ऑपरेटर का प्रकार उसके द्वारा दूसरे और तीसरे ऑपरैंट को निर्धारित करता है, न कि आपने परिणाम को किस प्रकार निर्दिष्ट किया है। पूर्णांक और एक अशक्त संदर्भ के बीच कोई सीधा कलाकार नहीं है, जो कि संकलक प्रकार निर्धारित करने के लिए उपयोग कर सकता है।