2010-04-09 9 views
21

निम्नलिखित कोड संकलन नहीं करता है:नल को यहां एक स्पष्ट प्रकार कास्ट क्यों चाहिए?

//int a = ... 
int? b = (int?) (a != 0 ? a : null); 

आदेश को संकलित करने में, यह

int? b = (a != 0 ? a : (int?) null); 

में परिवर्तित करने के बाद से दोनों b = null और b = a कानूनी रहे हैं की जरूरत है, यह मेरे लिए कोई मतलब नहीं है ।

हमें null को int? में क्यों डालना है और हम पूरी अभिव्यक्ति के लिए एक स्पष्ट प्रकार का कलाकार क्यों नहीं दे सकते (जिसे मैं अन्य मामलों में संभव जानता हूं)?

+8

मुझे लगता है कि संकलक आपको इतने सारे प्रश्न पूछना पसंद नहीं करता है। मेरा मतलब है, आप उनमें से 3 एक ही पंक्ति में पसंद है! – David

+2

यह आपके प्रश्न का उत्तर देना चाहिए कि क्यों: http://stackoverflow.com/questions/2215745/conditional-operator-cannot-cast-implicitly/2215959#2215959। यह सवाल * उस * का एक डुप्लिकेट नहीं है, लेकिन तर्क अभी भी वही है। –

+1

ध्यान दें कि 'int? बी = ए! = 0? (int?) a: null; ' –

उत्तर

18
सी # भाषा विशिष्टता की 7.13 अध्याय से

:

के दूसरे और तीसरे ऑपरेंड: ऑपरेटर नियंत्रण सशर्त अभिव्यक्ति के प्रकार। एक्स और वाई को दूसरे और तीसरे ऑपरेंड के प्रकार होने दें। फिर,

  • यदि एक्स और वाई समान प्रकार हैं, तो यह सशर्त अभिव्यक्ति का प्रकार है।
  • अन्यथा, यदि एक अंतर्निहित रूपांतरण (§6.1) एक्स से वाई तक मौजूद है, लेकिन वाई से एक्स तक नहीं है, तो वाई सशर्त अभिव्यक्ति का प्रकार है।
  • अन्यथा, यदि कोई अंतर्निहित रूपांतरण (§6.1) वाई से एक्स तक मौजूद है, लेकिन एक्स से वाई तक नहीं है, तो एक्स सशर्त अभिव्यक्ति का प्रकार है।
  • अन्यथा, कोई अभिव्यक्ति प्रकार निर्धारित नहीं किया जा सकता है, और संकलन-समय त्रुटि उत्पन्न होती है।

आपके मामले में, वहाँ पूर्णांक से कोई अंतर्निहित रूपांतरण शून्य पर और न ही दूसरी तरह के आसपास है। आपकी कास्ट समस्या हल करती है, int int में परिवर्तनीय है?

+0

आह, मैं देखता हूं। मुझे नहीं लगता कि दोनों अभिव्यक्तियों को एक ही प्रकार की आवश्यकता होनी चाहिए, हालांकि, जब तक वे दोनों निहित रूप से निर्दिष्ट प्रकार पर आते हैं - क्या होता है यदि मैं कहता हूं कि 'पशु पशु = (हालत? नई बिल्ली(): नया कुत्ता ()) '? –

+1

फिर आपको एक कंपाइलर त्रुटि भी मिल जाएगी। (जब तक आप किसी भी पक्ष को 'पशु' तक नहीं डालते) – SLaks

+1

असाइनमेंट कथन का बायां हाथ अभिव्यक्ति के प्रकार को प्रभावित नहीं करता है। बिल्लियों कुत्तों के लिए पूरी तरह से परिवर्तनीय नहीं हैं, मेरी पत्नी जोर देकर कहते हैं। –

1

ऐसा इसलिए है क्योंकि जब आप उस तरह के नोटेशन का उपयोग करते हैं, तो दोनों सदस्य एक ही प्रकार के होने चाहिए, इसलिए आपको स्पष्ट रूप से कहना होगा कि "यह सदस्य एक int है?"।

क्या यह स्पष्ट है?

+0

-1 भी काम करता है: उन्हें एक ही प्रकार के होने की आवश्यकता नहीं है, केवल किसी अन्य प्रकार के लिए जाति करने योग्य होने की आवश्यकता है: ऊपर देखें, @nobugz और @Vlad। – ANeves

+0

@ एसआरपीटी, मैं भी वोट देना चाहता था, लेकिन फिर मैंने देखा कि आपने वास्तव में डाउनवोट नहीं किया और मेरे डाउनवोट को कम किया। –

+0

=/मैं क्या? * [monocle pops] * शापित! मैंने डाउनवोट को कम किया क्योंकि मैंने अपना दिमाग बदल दिया, लेकिन टिप्पणी की शुरुआत में '-1:' को संपादित करना भूल गया - माफ़ी! (मैंने अपना दिमाग बदल दिया क्योंकि यह गलत जवाब नहीं है, बस बहुत सटीक या स्पष्ट नहीं है।) – ANeves

5

?: ऑपरेटर के दोनों विकल्प एक ही प्रकार के होने चाहिए। अन्यथा, संकलक पूरे सशर्त अभिव्यक्ति के प्रकार को कम नहीं कर सकता है।

nullint नहीं है, इसलिए आपको संकलक को संकेत देना होगा कि परिणामी प्रकार int? है।


संपादित करें: के रूप में अन्य लोगों ने बताया, दो प्रकार के एक ही होने की जरूरत नहीं है, लेकिन उनमें से एक-दूसरे के castable (कि एक और एक परिणाम प्रकार हो जाएगा) होना चाहिए। अधिक जानकारी के लिए specs देखें।

1

जब आप विभिन्न प्रकार के संचालन के साथ सशर्त ऑपरेटर का उपयोग करते हैं, तो संकलक जांच करेगा कि किस प्रकार के प्रकार को अन्य प्रकार में रूपांतरित किया जा सकता है।

यदि न तो प्रकार को किसी अन्य रूप में रूपांतरित रूप से परिवर्तित किया जा सकता है, तो यह एक त्रुटि देगा, भले ही कोई तीसरा प्रकार हो, जिसे वे दोनों स्पष्ट रूप से परिवर्तित कर सकें। कंपाइलर एक ही समय में दोनों तरफ एक निहित रूपांतरण नहीं डालेगा।

आपके मामले में, int और null दोनों को int? बनने के लिए निहित रूपांतरण की आवश्यकता है, इसलिए यह काम नहीं करता है।
आपको अपना कोड बदलने की जरूरत है ताकि एक तरफ int? हो और दूसरी तरफ निहित रूप से int? में परिवर्तित किया जा सके। यह करने के लिए जिस तरह से simplested new int?() साथ null को बदलने के लिए, इस तरह है:

int? b = (a != 0 ? a : new int?()); 

यह केवल एक अंतर्निहित रूपांतरण (int? को int) की आवश्यकता है।

5

यदि आप null के बजाय default(int?) का उपयोग करते हैं तो आप स्वयं को कास्टिंग से बचा सकते हैं।

int a = 42; 
int? b = (a != 0 ? a : default(int?)); 
0

यह काफी मेरे सवालों का one का डुप्लिकेट, सशर्त ऑपरेटर के बारे में है। यह शून्य नहीं है, यह वास्तव में : है।

उत्तर स्वीकार किया गया उत्तर एरिक लिपर्ट के अलावा किसी भी अन्य से नहीं है, जो सी # कंपाइलर टीम पर है।

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