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


166

यह संकलन क्यों नहीं करता है?

int? number = true ? 5 : null;

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


जवाबों:


340

युक्ति (spec7.14) कहती है कि सशर्त अभिव्यक्ति के लिए b ? x : y, तीन संभावनाएँ होती हैं, या तो xऔर yदोनों में एक प्रकार की और कुछ अच्छी स्थितियाँ होती हैं, केवल एक xऔर yएक प्रकार की और कुछ अच्छी परिस्थितियाँ मिलती हैं, या एक संकलन-समय की त्रुटि होती है होता है। यहां, "कुछ अच्छी स्थिति" का अर्थ है कि कुछ रूपांतरण संभव हैं, जो हम नीचे दिए गए विवरणों में प्राप्त करेंगे।

अब, हम जर्मन के विशेष भाग की ओर मुड़ते हैं:

यदि का केवल एक xऔर yएक प्रकार है, और दोनों xऔर y, परोक्ष उस प्रकार के लिए परिवर्तनीय हैं तो सशर्त अभिव्यक्ति के प्रकार है।

यहाँ मुद्दा यह है कि में

int? number = true ? 5 : null;

केवल एक सशर्त परिणाम का एक प्रकार होता है। यहाँ xएक intशाब्दिक है, और yवह है nullजिसके पास एक प्रकार नहीं है और nullएक int1 के लिए अनुमानित रूप से परिवर्तनीय नहीं है । इसलिए, "कुछ अच्छी स्थितियाँ" पूरी नहीं हुई हैं, और एक संकलन-समय त्रुटि होती है।

इसके आसपास दो तरीके हैं :

int? number = true ? (int?)5 : null;

यहां हम अभी भी उस मामले में हैं जहां केवल एक ही प्रकार xऔर yएक प्रकार है। ध्यान दें कि null अभी भी एक प्रकार नहीं है फिर भी संकलक को इसके साथ कोई समस्या नहीं होगी क्योंकि (int?)5और nullदोनों int?अनुमानित रूप से (and6.1.4 और §6.1.5) के लिए परिवर्तनीय हैं ।

दूसरा तरीका स्पष्ट है:

int? number = true ? 5 : (int?)null;

लेकिन अब हमें यह समझने के लिए एक अलग खंड पढ़ना होगा कि यह ठीक क्यों है:

अगर xटाइप है Xऔर yटाइप है Yतो

  • यदि एक अंतर्निहित रूपांतरण (.16.1) से मौजूद Xहै Y, लेकिन से नहीं Yहै X, तो Yसशर्त अभिव्यक्ति का प्रकार है।

  • यदि एक अंतर्निहित रूपांतरण (.16.1) से मौजूद Yहै X, लेकिन से नहीं Xहै Y, तो Xसशर्त अभिव्यक्ति का प्रकार है।

  • अन्यथा, कोई भी अभिव्यक्ति प्रकार निर्धारित नहीं किया जा सकता है, और एक संकलन-समय त्रुटि होती है।

यहाँ xप्रकार intका yहै और प्रकार का है int?। से कोई अंतर्निहित रूपांतरण नहीं int?है int, लेकिन एक अंतर्निहित रूपांतरण intहै int?जिससे कि अभिव्यक्ति का प्रकार है int?

1 : आगे ध्यान दें कि सशर्त अभिव्यक्ति के प्रकार का निर्धारण करने में बाएं हाथ की ओर के प्रकार को अनदेखा किया जाता है, यहां भ्रम का एक सामान्य स्रोत है।


4
ऐसा क्यों होता है, यह बताने के लिए युक्ति का अच्छा उद्धरण - +1!
जेरकीबॉल

7
एक अन्य विकल्प के new int?()स्थान पर है (int?)null
गुवाँटे

1
यह भी मामला है यदि आपके पास एक अशक्त डेटाबेस फ़ील्ड प्रकार है, उदाहरण के लिए एक अशक्त DateTime और आप कोशिश करते हैं और डेटा DateTimeडालते हैं, जब यह आवश्यक होता है(DateTime?)
माइक Upjohn

73

null कोई पहचानने योग्य प्रकार नहीं है - इसे खुश करने के लिए बस थोड़ी सी पैठ की जरूरत है:

int? number = true ? 5 : (int?)null;

2
या आप कर सकते हैंint? number = true ? 5 : null as int?;
ब्रैड एम

अच्छा जवाब है। अच्छा संबंधित पढ़ने: ericlippert.com/2013/05/30/what-the-meaning-of-is-is
बेंजामिन

मुद्दा यह नहीं है कि nullपहचान योग्य प्रकार नहीं है। मुद्दा यह है कि इसमें से कोई अंतर्निहित रूपांतरण नहीं nullहै int। विवरण यहाँ है
jason

दिलचस्प बात यह है कि int? number = true ? 5 : (int?)null;और int? number = true ? (int?)5 : null;दोनों संकलन है !! स्क्रैच, खरोंच
davidhq

2
मैं ठीक से कवर करता हूं कि मेरे जवाब में ऐसा क्यों होता है ।
जेसन

4

जैसा कि दूसरों ने उल्लेख किया है, 5 एक है int, और nullइसे संक्षेप में परिवर्तित नहीं किया जा सकता है int

इस मुद्दे पर काम करने के अन्य तरीके इस प्रकार हैं:

int? num = true ? 5 : default(int?);
int? num = true ? 5 : new int?();

int? num = true ? 5 : null as int?;
int? num = true ? 5 : (int?)null;

int? num = true ? (int?)5 : null;
int? num = true ? 5 as int? : null;

int? num = true ? new int?(5) : null;

इसके अलावा, कहीं भी आप देखते हैं int?, आप भी उपयोग कर सकते हैं Nullable<int>


1

इसमें C# 9अब अनुमति है ब्लॉग

टारगेट टाइप किया ?? तथा ?

कभी-कभी सशर्त ?? और ?: अभिव्यक्तियों में शाखाओं के बीच एक स्पष्ट साझा प्रकार नहीं है। ऐसे मामले आज विफल हैं, लेकिन C # 9.0 उन्हें अनुमति देगा यदि कोई लक्ष्य प्रकार है जिसे दोनों शाखाएँ रूपांतरित करती हैं:

Person person = student ?? customer; // Shared base type
int? result = b ? 0 : null; // nullable value type

या आपका उदाहरण:

// Allowed in C# 9.
int? number = true ? 5 : null;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.