यह संकलन क्यों नहीं करता है?
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
एक int
1 के लिए अनुमानित रूप से परिवर्तनीय नहीं है । इसलिए, "कुछ अच्छी स्थितियाँ" पूरी नहीं हुई हैं, और एक संकलन-समय त्रुटि होती है।
इसके आसपास दो तरीके हैं :
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;