निम्नलिखित सामान्य तरीका अपनाएं:
public static T Get<T>(T value)
{
return value;
}
अगर हम इसे कहते हैं Get<string>(s)
, तो वापसी गैर-अशक्त है, और यदि हम करते हैंGet<string?>(s)
, तो यह अशक्त है।
हालाँकि यदि आप इसे सामान्य तर्क के साथ कह रहे हैं Get<T>(x)
और जैसे T
हल नहीं किया गया है, उदाहरण के लिए यह आपके सामान्य वर्ग के लिए एक सामान्य तर्क है जैसे ...
class MyClass<T>
{
void Method(T x)
{
var result = Get<T>(x);
// is result nullable or non-nullable? It depends on T
}
}
यहां कंपाइलर को नहीं पता है कि आखिरकार इसे एक अशक्त या गैर-अशक्त प्रकार के साथ कहा जाएगा।
एक नए प्रकार की बाधा है जिसका उपयोग हम संकेत देने के लिए T
कर सकते हैं कि अशक्त नहीं हो सकता है:
public static T Get<T>(T value) where T: notnull
{
return value;
}
हालांकि, जहां T
असंबंधित है और अभी भी खुला है, अशक्तता अज्ञात है।
यदि इन अज्ञात को अशक्त माना जाता है तो आप निम्नलिखित कोड लिख सकते हैं:
class MyClass<T>
{
void Method(T x)
{
var result = Get<T>(x);
// reassign result to null, cause we we could if unknown was treated as nullable
result = null;
}
}
उस मामले में जहां T
अशक्त नहीं था, हमें चेतावनी मिलनी चाहिए थी। इसलिए अज्ञात अशक्तता के प्रकारों के साथ, हम चाहते हैं कि डेरेफेरिंग करते समय चेतावनी दी जाए, लेकिन संभावित रूप से असाइन करने के लिए चेतावनी भी null
।