पर विचार करें निम्नलिखित कोड:Nullable <T> का शून्य-प्रसार क्यों करता है टी नहीं और Nullable <T> नहीं?
Nullable<DateTime> dt;
dt. <-- Nullable<DateTime>
dt?. <-- DateTime
अशक्त प्रचार रिटर्न T
, बल्कि Nullable<T>
से।
कैसे और क्यों?
पर विचार करें निम्नलिखित कोड:Nullable <T> का शून्य-प्रसार क्यों करता है टी नहीं और Nullable <T> नहीं?
Nullable<DateTime> dt;
dt. <-- Nullable<DateTime>
dt?. <-- DateTime
अशक्त प्रचार रिटर्न T
, बल्कि Nullable<T>
से।
कैसे और क्यों?
क्योंकि ?.
के बाएं हाथ की ओर ऑब्जेक्ट सही है, तो दाईं ओर ऑब्जेक्ट को कभी भी निष्पादित नहीं किया जाता है। क्योंकि आप जानते हैं कि दायां हाथ कभी भी शून्य नहीं हो सकता है, यह सुविधा के रूप में 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);
}
}
ऊपर कोड नहीं है कानूनी सी # यह के बारे में सोच सकता है, लेकिन है कि व्यवहार यह करता है।
जब आप कहते हैं "यह नलबल से बाहर निकलता है" क्या यह अनिवार्य रूप से वाक्य रचनात्मक चीनी है? – series0ne
हां, यह अनिवार्य रूप से है। यह आपके लिए 'वाल्यू' कॉल करता है, इसलिए आपको इसकी आवश्यकता नहीं है। –
मैं देखता हूं। मुझे लगता है कि ऊपर दिया गया कोड काम नहीं करता है क्योंकि शून्य प्रचार ऑपरेटर को अधिभारित नहीं किया जा सकता है? – series0ne
ठीक है, 'वैल्यू' जोड़ना हर बार व्यर्थ होगा अगर इसे केवल मूल्य के दौरान बुलाया गया था, तो संभवतः उन्होंने इसे एक उठाए गए ऑपरेटर की तरह थोड़ा इलाज करने का फैसला किया? –