2016-11-17 6 views
5

पर विचार करें निम्नलिखित कोड:Nullable <T> का शून्य-प्रसार क्यों करता है टी नहीं और Nullable <T> नहीं?

Nullable<DateTime> dt; 

dt. <-- Nullable<DateTime> 
dt?. <-- DateTime 

अशक्त प्रचार रिटर्न T, बल्कि Nullable<T> से।

कैसे और क्यों?

+0

ठीक है, 'वैल्यू' जोड़ना हर बार व्यर्थ होगा अगर इसे केवल मूल्य के दौरान बुलाया गया था, तो संभवतः उन्होंने इसे एक उठाए गए ऑपरेटर की तरह थोड़ा इलाज करने का फैसला किया? –

उत्तर

5

क्योंकि ?. के बाएं हाथ की ओर ऑब्जेक्ट सही है, तो दाईं ओर ऑब्जेक्ट को कभी भी निष्पादित नहीं किया जाता है। क्योंकि आप जानते हैं कि दायां हाथ कभी भी शून्य नहीं हो सकता है, यह सुविधा के रूप में Nullable को स्ट्रिप्स करता है ताकि आपको हर बार .Value टाइप करने की आवश्यकता न हो।

आप के रूप

public static T operator ?.(Nullable<U> lhs, Func<U,T> rhs) 
    where T: class 
    where U: struct 
{ 
    if(lhs.HasValue) 
    { 
     return rhs(lhs.Value); 
    } 
    else 
    { 
     return default(T); 
    } 
} 

ऊपर कोड नहीं है कानूनी सी # यह के बारे में सोच सकता है, लेकिन है कि व्यवहार यह करता है।

+1

जब आप कहते हैं "यह नलबल से बाहर निकलता है" क्या यह अनिवार्य रूप से वाक्य रचनात्मक चीनी है? – series0ne

+0

हां, यह अनिवार्य रूप से है। यह आपके लिए 'वाल्यू' कॉल करता है, इसलिए आपको इसकी आवश्यकता नहीं है। –

+0

मैं देखता हूं। मुझे लगता है कि ऊपर दिया गया कोड काम नहीं करता है क्योंकि शून्य प्रचार ऑपरेटर को अधिभारित नहीं किया जा सकता है? – series0ne

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