बदलता है मैं कोड के अगले तीन लाइनों एक ही होने की अपेक्षा करेंगे:नल प्रकार पर अशक्त ऑपरेटर वालों का उपयोग कर निहित प्रकार
public static void TestVarCoalescing(DateTime? nullableDateTime)
{
var dateTimeNullable1 = nullableDateTime.HasValue ? nullableDateTime : DateTime.Now;
var dateTimeNullable2 = nullableDateTime != null ? nullableDateTime : DateTime.Now;
var dateTimeWhatType = nullableDateTime ?? DateTime.Now;
}
सभी मामलों में, मैं नया वेरिएबल को nullableDateTime
आवंटित। मैं उम्मीद करता हूं कि सभी चर के प्रकार DateTime?
बन जाएंगे क्योंकि यह nullableDateTime
का प्रकार है। लेकिन मेरे आश्चर्य के लिए, dateTimeWhatType
का प्रकार सिर्फ DateTime
बन गया है, इसलिए शून्य नहीं है।
बातें बदतर बनाने के लिए ReSharper यह अभिव्यक्ति 3. में तब्दील हो तो अगर मैं ReSharper अपने काम करते हैं, चर के प्रकार DateTime?
से DateTime
के लिए बदल जाएगा, एक अशक्त वालों अभिव्यक्ति के साथ दूसरे नंबर पर बयान बदलने के लिए पता चलता है।
वास्तव में, मान लें कि विधि के शेष में, मैं प्रयोग करेंगे जाने
if (someCondition) dateTimeNullable2 = null;
कि ठीक संकलन होता है, जब तक मैं ReSharper अशक्त वालों संस्करण के साथ दूसरे नंबर पर अभिव्यक्ति की जगह करते हैं।
AFAIK,
somevar ?? somedefault;
साथ
somevar != null ? somevar : somedefault;
जगह वास्तव में एक ही परिणाम का उत्पादन करना चाहिए। लेकिन एक नामुमकिन प्रकार पर निहित टाइपिंग के लिए, कंपाइलर ??
को खतरे में डालता है जैसे इसका मतलब है।
somevar != null ? somevar.Value : somedefault;
तो मुझे लगता है कि मेरे सवाल क्यों अंतर्निहित प्रकार जब मैं ??
का उपयोग बदल गया है, और यह भी जहां दस्तावेज में मैं इस पर जानकारी मिल सकता है।
बीटीडब्ल्यू, यह वास्तविक दुनिया परिदृश्य नहीं है, लेकिन मैं जानना चाहता हूं कि ??
का उपयोग क्यों (अंतर्निहित) प्रकार का उपयोग करता है।
आप 'nullableDateTime की अपेक्षा क्यों करेंगे ?? डेटटाइम.अब' 'डेटटाइम' का उत्पादन करने के लिए, जब संकलक के पास पर्याप्त जानकारी है कि परिणाम कभी भी 'शून्य' नहीं होगा? –
@ डेमियन: मेरे पहले और दूसरे उदाहरण में संकलक के पास पर्याप्त जानकारी है कि परिणाम कभी भी 'शून्य' नहीं होगा। यही कारण है कि मुझे इस व्यवहार को अजीब लगता है। – comecme
लेकिन '?: 'संभावित इनपुट की एक बड़ी श्रृंखला का समर्थन करें (कोई कारण नहीं है कि' स्थिति 'को किसी भी परिणाम' अभिव्यक्ति 'से कनेक्ट किया जाना चाहिए)। इस प्रकार, इस विश्लेषण को '?:' के खिलाफ करने के लिए संकलक के लिए आर्किटेक्टेड होना असामान्य होगा। जबकि, '??' के लिए, यह वास्तव में जानता है कि परिणाम पहली अभिव्यक्ति होगी जिसमें अभिव्यक्ति शून्य या दूसरी अभिव्यक्ति की संभावना नहीं है। –