C # 8 में अज्ञात अशक्तता क्या है?


12

C # 8.0 में हमारे पास अशक्त संदर्भ प्रकार हो सकते हैं। डॉक्स बताता है कि अशक्तता के 4 प्रकार हैं। पहले 3 काफी स्पष्ट हैं, लेकिन मैं "अज्ञात" के बिंदु को समझने में विफल हूं। डॉक्स का कहना है कि इसका उपयोग जेनरिक के साथ किया जाता है, लेकिन जब मैं जे में टाइप के अप्रतिबंधित चर पर एक विधि को कॉल करने की कोशिश करता हूं, तो यह चेतावनी देता है जैसे कि टाइप अशक्त है। मैं अज्ञात और अशक्त के बीच अंतर को देखने में विफल रहता हूं। अज्ञात क्यों मौजूद है? यह स्वयं को कैसे प्रकट करता है?

जवाबों:


12

निम्नलिखित सामान्य तरीका अपनाएं:

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


जब मैं var result = Test.Get <T> (x) करता हूं; result.ToString (); संकलक संभावित रूप से अशक्त मान के बारे में शिकायत करता है। मैं नहीं देखता कि कैसे अज्ञात इस मामले में बस अशक्त से अलग है।
स्टिलगर

1
चेतावनियों के संदर्भ में वे समान व्यवहार करते हैं, लेकिन वे शब्दार्थ रूप से भिन्न हैं। आप कह सकते हैं कि अंतर अकादमिक है, और अगर आपकी बात यही थी तो मैं सहमत हूं।
स्टुअर्ट

1
मैं फिर भी जानना चाहूंगा कि अंतर क्यों पेश किया गया। शैक्षणिक उद्देश्यों के लिए भाषा में इस तरह के अंतर को पेश करना अजीब लगता है।
स्टिलगर

मेरा बुरा, बस युक्ति को फिर से पढ़ें, उत्तर को अपडेट करें, अंतिम भाग इसे समझाता है।
स्टुअर्ट

1
आह यह अधिक पसंद है
स्टिल्गर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.