2012-07-11 5 views
6

कोड के इस स्निपेट पर विचार करें:सी # में लैम्ब्डा क्यों बूलियन रिटर्न वैल्यू को अलग-अलग संभालने लगते हैं?

Func<int, bool> TestGreaterThanOne = delegate(int a) { 
       if (a > 1) return (true); 
       else return(false); 
       }; 

उपरोक्त कोड में, मैं "और वापसी (गलत)" बयान नहीं हटा सकते हैं - संकलक ने चेतावनी दी है कि नहीं सभी कोड पथ मान। लेकिन निम्नलिखित कोड है, जो एक लैम्ब्डा का उपयोग करता है ...

Func<int, bool> TestGreaterThanOne = a => a > 1; 

मैं एक "और" बयान है की जरूरत नहीं है में - कोई संकलक चेतावनी है और तर्क के रूप में उम्मीद काम करता है।

मेरे लैम्ब्डा में "अन्य" कथन नहीं करने के लिए यहां क्या तंत्र चल रहा है?

+0

बस स्पष्ट करने के लिए, लैम्ब्डा अभिव्यक्ति में विशेष रूप से बूल का कोई विशेष संचालन नहीं होता है। आप 'प्रतिनिधि' संस्करण को वैसे ही लिख सकते हैं जैसे रेमंड चेन नीचे करता है। यहां केवल लैम्ब्डा विशेषता है, इन-लाइन स्टेटमेंट के लिए 'रिटर्न' निर्दिष्ट करने की कमी है जहां रिटर्न वैल्यू अनुमानित किया जा सकता है (जैसा कि यह आपके उदाहरण में है)। –

उत्तर

21

क्योंकि आपके लैम्ब्डा शॉर्टंड में, कोई कथन नहीं है। आपका लैम्ब्डा शॉर्टैंड

Func<int, bool> TestGreaterThanOne = delegate(int a) { 
      return (a > 1); 
      }; 

के समतुल्य है इसलिए सभी कोड पथ एक मान लौटाते हैं।

+0

आह, ज़ाहिर है। मैं अब देख सकता हूँ। धन्यवाद। –

2

अन्य प्रतिक्रियाओं में थोड़ा जोड़ने के लिए, अपने लैम्ब्डा स्टेटमेंट में, a > 1 एक बुलियन का मूल्यांकन करता है, जिसे तब वापस कर दिया जाता है।

आम तौर पर, return true; और return false; कथन लिखना अनावश्यक माना जाता है। अभिव्यक्ति का मूल्यांकन करने के लिए बस इतना आसान है।

0

मुझे नहीं लगता कि वे आपके द्वारा उल्लेखित मामले में बूलियन मानों को अलग-अलग प्रबंधित कर रहे हैं। कोड सिर्फ दो अलग-अलग चीजें कर रहा है। चूंकि आप Func को Func<int, bool> के रूप में परिभाषित करते हैं, इसलिए इसे बूलियन रिटर्न मान की आवश्यकता होती है। कोड का दूसरा भाग हमेशा एक बूलियन देता है। हालांकि कोड का पहला भाग तब तक एक बूलियन नहीं लौटाता जब तक कि आप अन्य शामिल न करें।

0

a>1 स्वयं एक बूलियन है, और यही कारण है कि आपका लैम्ब्डा काम करता है। आप लगभग एक समारोह है कि एक बूलियन पैरामीटर लेता है के रूप में एक अगर बयान के बारे में सोच सकते हैं, हां, तो आप की तरह

boolean b = true 

if(b) 
    doSomething(); 

कुछ कर सकते हैं और यह संकलन होगा, और प्रतिनिधि को फिर से लिखने के लिए DoSomething

1

निष्पादित विकल्प के रूप में, आप कर रहे हैं लैम्ब्डा अमूर्त

Func<int, bool> TestGreaterThanOne = a => { 
      if (a > 1) return (true); 
      else return(false); 
      }; 

कहाँ आप और शाखा या तो नष्ट नहीं कर सकते के बराबर है। क्योंकि यह या तो वापस नहीं होगा। वर्तमान संस्करण काम करता है क्योंकि a > 1 एक बुलियन मान है (जो हमेशा मौजूद होता है)।

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