2012-04-16 14 views
12

बदलता है मैं कोड के अगले तीन लाइनों एक ही होने की अपेक्षा करेंगे:नल प्रकार पर अशक्त ऑपरेटर वालों का उपयोग कर निहित प्रकार

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; 

तो मुझे लगता है कि मेरे सवाल क्यों अंतर्निहित प्रकार जब मैं ?? का उपयोग बदल गया है, और यह भी जहां दस्तावेज में मैं इस पर जानकारी मिल सकता है।

बीटीडब्ल्यू, यह वास्तविक दुनिया परिदृश्य नहीं है, लेकिन मैं जानना चाहता हूं कि ?? का उपयोग क्यों (अंतर्निहित) प्रकार का उपयोग करता है।

+3

आप 'nullableDateTime की अपेक्षा क्यों करेंगे ?? डेटटाइम.अब' 'डेटटाइम' का उत्पादन करने के लिए, जब संकलक के पास पर्याप्त जानकारी है कि परिणाम कभी भी 'शून्य' नहीं होगा? –

+0

@ डेमियन: मेरे पहले और दूसरे उदाहरण में संकलक के पास पर्याप्त जानकारी है कि परिणाम कभी भी 'शून्य' नहीं होगा। यही कारण है कि मुझे इस व्यवहार को अजीब लगता है। – comecme

+1

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

उत्तर

6

आपके पहले दो उदाहरण आपको भटकने वाले हैं; बेहतर नहीं अपने

var dateTimeNullable1 = nullableDateTime.HasValue 
    ? nullableDateTime 
    : DateTime.Now; 

बल्कि

var dateTimeNullable1 = nullableDateTime.HasValue 
    ? nullableDateTime.Value 
    : DateTime.Now; 

के शब्दों में खंड 7.12 सी # 3.0 कल्पना की "शून्य कोलेसिंग ऑपरेटर" (थोड़ा ropey प्रारूपण के लिए क्षमा याचना) पर विचार करने के होगा:

अभिव्यक्ति का प्रकार a ?? b इस बात पर निर्भर करता है कि रूपांतरण avai हैं ऑपरेटरों के प्रकार के बीच योग्य।आदेश वरीयता के में, a ?? b के प्रकार A0, A, या B, जहां Aa के प्रकार है, Bb के प्रकार है (बशर्ते कि b एक प्रकार है), और A0A का अंतर्निहित प्रकार है यदि A अन्यथा एक शून्य प्रकार या A है।

तो अगर aNullable<Something> है, और b परोक्ष Something में बदला जा सकता, पूरे अभिव्यक्ति के प्रकार Something हो जाएगा। @Damien_The_Unbeliever के अनुसार, इस ऑपरेटर के बिंदु को हल करने के लिए है!

+1

अब तक मैंने केवल [एमएसडीएन दस्तावेज '?? '' (http://msdn.microsoft.com/en-us/library/ms173224.aspx) पर खोजा है और [उपयोग करने योग्य प्रकारों का उपयोग] (http: // msdn .microsoft.com/en-us/पुस्तकालय/2cf62fcy.aspx)। वे उन उदाहरणों में कभी भी 'var' का उपयोग नहीं करते हैं लेकिन एक स्पष्ट प्रकार को असाइन करते हैं। वैसे भी, जाहिर है 'एक ?? बी' ** ** नहीं है ** बिल्कुल 'ए! = शून्य के समान है? ए: बी' जब यह शून्य प्रकारों की बात आती है। – comecme

5

एक पल के लिए, सभी भाषा वकील जाने के लिए। सी # कल्पना (4 संस्करण) से:

7,13

अभिव्यक्ति a ?? b के प्रकार पर निर्भर करता है अंतर्निहित रूपांतरण ऑपरेंड पर उपलब्ध हैं। वरीयता के क्रम में, a ?? b के प्रकार A0, A, या B, जहां Aa के प्रकार है (बशर्ते b एक प्रकार है) है (बशर्ते a एक प्रकार है), Bb के प्रकार है, और A0A का अंतर्निहित प्रकार A एक शून्य प्रकार है, या A अन्यथा है।

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

से 7.14 (?: के साथ काम कर) भाषा जबकि केवल x और y की वास्तविक प्रकार की चर्चा, प्रपत्र b ? x : y से, और इन दो प्रकार के बीच निहित रूपांतरण चर्चा करता है।

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

Nullable(T) के बाद से एक निहित रूपांतरण को परिभाषित करता है, तो T से Nullable(T), और केवल स्पष्टNullable(T) से T पर रूपांतरण, समग्र अभिव्यक्ति का एकमात्र संभावित प्रकार Nullable(T) है।

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