यह संकलन क्यों नहीं करता है?
int? number = true ? 5 : null;
सशर्त अभिव्यक्ति का प्रकार निर्धारित नहीं किया जा सकता है क्योंकि 'int' और <null> के बीच कोई अंतर्निहित रूपांतरण नहीं है
यह संकलन क्यों नहीं करता है?
int? number = true ? 5 : null;
सशर्त अभिव्यक्ति का प्रकार निर्धारित नहीं किया जा सकता है क्योंकि 'int' और <null> के बीच कोई अंतर्निहित रूपांतरण नहीं है
जवाबों:
युक्ति (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 : आगे ध्यान दें कि सशर्त अभिव्यक्ति के प्रकार का निर्धारण करने में बाएं हाथ की ओर के प्रकार को अनदेखा किया जाता है, यहां भ्रम का एक सामान्य स्रोत है।
new int?()स्थान पर है (int?)null।
DateTimeडालते हैं, जब यह आवश्यक होता है(DateTime?)
null कोई पहचानने योग्य प्रकार नहीं है - इसे खुश करने के लिए बस थोड़ी सी पैठ की जरूरत है:
int? number = true ? 5 : (int?)null;
int? number = true ? 5 : null as int?;
int? number = true ? 5 : (int?)null;और int? number = true ? (int?)5 : null;दोनों संकलन है !! स्क्रैच, खरोंच
जैसा कि दूसरों ने उल्लेख किया है, 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>।
इसमें 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;