मैं एक उदाहरण के रूप int
उपयोग कर रहा हूँ, लेकिन इस के बाद एक संकलक अपवाद फेंक नेट 2+: क्यों (1 == शून्य) अब एक कंपाइलर अपवाद फेंक नहीं देता है?
नेट
में कोई मान प्रकार के लिए लागू होता नेट 1: (नेट 2 मेंint i = SomeFunctionThatReturnsInt();
if(i == null) //compiler exception here
अब या 3.5) वह अपवाद चला गया है।
मैं जानता हूँ कि ऐसा क्यों है:
int? j = null; //nullable int
if(i == j) //this shouldn't throw an exception
समस्या क्योंकि int?
व्यर्थ है और int
अब int?
करने के लिए एक अंतर्निहित डाली गई है। ऊपर वाक्यविन्यास संकलक जादू है। वास्तव में हम कर रहे हैं:
Nullable<int> j = null; //nullable int
//compiler is smart enough to do this
if((Nullable<int>) i == j)
//and not this
if(i == (int) j)
तो अब, हम जब हम i == null
कर मिलती है:
if((Nullable<int>) i == null)
यह देखते हुए कि सी # वैसे भी इस गणना क्यों नहीं इसे करने के लिए बहुत चालाक हो सकता है के लिए संकलक तर्क कर रही है null
जैसे पूर्ण मूल्यों से निपटने पर ऐसा न करें?
कंपाइलर सही ढंग से स्पॉट करता है कि यह कभी भी सच नहीं है, जैसा कि आपने 1 == 2 किया था। यह जानना काफी समझदार है कि इंट को अंतर्निहित रूप से int में डाला जा सकता है? और वह int? शून्य से तुलना की जा सकती है। मुझे आशा है कि पूरे ब्लॉक को पट्टी करने के लिए ऑप्टिमाइज़र के स्मार्ट पर्याप्त हैं। – Keith