HNQ पर इस प्रश्न को पढ़ने के बाद , मैंने C # 8 में Nullable Reference Types के बारे में पढ़ा , और कुछ प्रयोग किए।
मुझे बहुत पता है कि 10 में से 9 बार या उससे भी अधिक बार, जब कोई कहता है कि "मुझे एक कंपाइलर बग मिला!" यह वास्तव में डिजाइन द्वारा, और उनकी अपनी गलतफहमी है। और जब से मैंने इस सुविधा को केवल आज ही देखना शुरू किया है, स्पष्ट रूप से मुझे इसकी बहुत अच्छी समझ नहीं है। इस तरह से, इस कोड को देखने की सुविधा देता है:
#nullable enable
class Program
{
static void Main()
{
var s = "";
var b = s == null; // If you comment this line out, the warning on the line below disappears
var i = s.Length; // warning CS8602: Dereference of a possibly null reference
}
}
मैंने ऊपर दिए गए दस्तावेज़ को पढ़ने के बाद, मुझे उम्मीद है कि s == null
लाइन मुझे एक चेतावनी देगी - आखिरकार s
यह स्पष्ट रूप से गैर-अशक्त है, इसलिए इसकी तुलना करने से null
कोई मतलब नहीं है।
इसके बजाय, मुझे अगली पंक्ति पर एक चेतावनी मिल रही है , और चेतावनी कहती है कि s
एक अशक्त संदर्भ संभव है, भले ही एक मानव के लिए, यह स्पष्ट है कि यह नहीं है।
अधिक से अधिक, अगर हम तुलना नहीं करते हैं तो चेतावनी प्रदर्शित नहीं की जाती s
है null
।
मैंने कुछ Googling किया और मैंने एक GitHub मुद्दे को मारा , जो पूरी तरह से कुछ और के बारे में निकला, लेकिन इस प्रक्रिया में मैंने एक योगदानकर्ता के साथ बातचीत की, जिसने इस व्यवहार में कुछ और अंतर्दृष्टि दी (उदाहरण के लिए "Null जाँच अक्सर एक उपयोगी तरीका है एक चर की अशक्तता के बारे में इसके पूर्व अनुमान को रीसेट करने के लिए संकलक के बारे में बताना। " )। यह अभी भी मुझे अनुत्तरित मुख्य प्रश्न के साथ छोड़ गया, हालांकि।
एक नया GitHub मुद्दा बनाने के बजाय, और संभवतः अविश्वसनीय रूप से व्यस्त परियोजना योगदानकर्ताओं का समय निकालकर, मैं इसे समुदाय के सामने रख रहा हूं।
क्या आप मुझे समझा सकते हैं कि क्या चल रहा है और क्यों? विशेष रूप से, s == null
लाइन पर कोई चेतावनी क्यों नहीं उत्पन्न होती है , और हमारे पास ऐसा क्यों है CS8602
जब ऐसा नहीं लगता कि null
यहां संदर्भ संभव है? यदि अशक्तता इंजेक्शन बुलेट-प्रूफ नहीं है, जैसा कि लिंक किए गए गिटहब धागे से पता चलता है, यह कैसे गलत हो सकता है? इसके कुछ उदाहरण क्या होंगे?
?
क्योंकि s
यह अशक्त नहीं है। यह अशक्त नहीं होता है, केवल इसलिए कि हम इसकी तुलना करने के लिए पर्याप्त रूप से मूर्ख थे null
।