2013-07-21 8 views
13

मैंने अभी एक SO post पढ़ा है जो समझाया गया है कि FirstOrDefault() का रिटर्न प्रकार चयनित तत्व के मान के आधार पर अलग-अलग होगा।Int और Int के साथ FirstOrDefault व्यवहार?

उदाहरण:

ICollection<String> list = new List<String>(); 
list.Add("bye"); 

int a = (from x in list where (x == "hi") select x.Length).FirstOrDefault(); 

इस उदाहरण में, a 0 के बराबर के बाद से int डिफ़ॉल्ट मान 0.

हालांकि है हो जाएगा, मैं करने के लिए .Cast<int?>() पहले से लिंक पोस्ट के अनुसार जोड़ सकते हैं null प्राप्त करें जब क्वेरी 0 परिणाम लौटाती है।

int? a = (from x in list where ... x.Length).Cast<int?>().FirstOrDefault(); 

मैं एक संकलन समय त्रुटि क्यों नहीं मिलता है (या कम से कम एक चेतावनी), मेरा पहला उदाहरण के लिए, मैं एक Nullable पूर्णांक (int?) का उपयोग करते हैं बल्कि एक नियमित int से?

अगर मैं सही ढंग से समझ, जब null के एक मूल्य में मेरी पहली क्वेरी होगा कभी नहीं परिणाम प्रदर्शन कर एक int? का उपयोग कर।

+2

आपका प्रश्न मुझे स्पष्ट नहीं है। बिना किसी चेतावनी के सटीक कोड संकलित करते हैं जहां आपको त्रुटि/चेतावनी की उम्मीद है? यह सही है कि 'int' के लिए defalt मान' 0' है, और 'int? 'का' शून्य 'है। –

+0

हाय @ जेपेस्टिगनिएल्सन - मैं उलझन में था कि उपरोक्त 'int?' उदाहरण के लिए कंपाइलर, मुझे नलबल प्रकार का उपयोग करने देगा, भले ही 'शून्य' कभी वापस नहीं आएगा। 'dasblinkenlight 'पूरी तरह से मेरे सवाल का जवाब दिया। –

उत्तर

9

मैं एक संकलन समय त्रुटि क्यों नहीं मिलता है (या कम से कम एक चेतावनी) जब, मेरा पहला उदाहरण के लिए, मैं एक Nullable int बल्कि एक नियमित int तो तुलना का उपयोग करें? यदि मैं एक int का उपयोग कर सही ढंग से समझता हूं? मेरी पहली क्वेरी करने पर कभी भी null का मान नहीं होगा।

आपकी समझ सही है। हालांकि, कंपाइलर परिवर्तनीय a को शून्य के रूप में घोषित करने की आपकी इच्छा में हस्तक्षेप नहीं करता है, क्योंकि यह एक "चौड़ा" रूपांतरण है: भले ही LINQ क्वेरी से असाइनमेंट कभी भी null वापस नहीं आएगा, तो आपके पास एक ही चर के लिए अन्य उपयोग हो सकता है नीचे:

int? a = (from x in list where (x == "hi") select x.Length).FirstOrDefault(); 
// Do something with `a`, which will not be null 
... 
a = null; 
if (someCondition) { 
    a = someNotNullValue(); 
} 
// Here, a may or may not be null 
... 
+0

[तरफ] जब आप कोड पूर्ण और अनुभव से याद करते हैं, तो वैरिएबल 'ए' को कई स्पॉट्स में उपयोग करने के खिलाफ बहस नहीं करेंगे, एक चर के विस्तार को बढ़ाने से पठनीयता को नुकसान पहुंचा सकता है। –

+3

@ केविन मैं एक चर का उपयोग करने के खिलाफ बहस करने वाला पहला व्यक्ति होगा, जब तक कि कोई इसे निकट से संबंधित उद्देश्य के लिए उपयोग न करे। हालांकि, कंपाइलर्स को सर्वोत्तम प्रथाओं को लागू करने के लिए ज़िम्मेदार नहीं ठहराया जाना चाहिए: उन्हें यह मानना ​​चाहिए कि कौन से प्रोग्रामर उन्हें करने के लिए कहते हैं, जिससे प्रोग्रामर इस तरह के "महत्वहीन" चीजों को अपने स्वयं के कार्यक्रमों की पठनीयता के बारे में चिंता करते हैं। – dasblinkenlight

+0

विचारशील शब्दों के लिए धन्यवाद। –

संबंधित मुद्दे