2012-08-13 16 views
10

के साथ लैम्ब्डा रूपांतरण यदि मेरे पास () => { throw new Exception(); } जैसे लैम्ब्डा है, तो यह स्पष्ट नहीं है कि इसमें वापसी का प्रकार है या नहीं। इस वजह से, यह (अंतर्निहित रूप से) Action और Func<object> (या किसी अन्य Func<T>) में परिवर्तित किया जा सकता है। इसका कारण यह है है, §6.5 बेनामी समारोह रूपांतरण सी # 4 कल्पना की के अनुसार:अस्पष्ट रिटर्न प्रकार और ओवरलोड रिज़ॉल्यूशन

[एक] प्रतिनिधि प्रकार D एक गुमनाम समारोह F प्रदान की साथ संगत है:

  • ...

  • यदि D में void रिटर्न प्रकार है और F का शरीर एक कथन ब्लॉक है, जब [...]का शरीर 10 एक वैध कथन ब्लॉक है जिसमें कोई रिटर्न स्टेटमेंट अभिव्यक्ति निर्दिष्ट नहीं करता है।

  • तो D एक गैर शून्य वापसी प्रकार और F का शरीर है एक बयान ब्लॉक, जब [...] F के शरीर एक गैर पहुंच योग्य अंत बिंदु के साथ एक मान्य बयान ब्लॉक है जिसमें प्रत्येक return बयान निर्दिष्ट एक अभिव्यक्ति जो D के रिटर्न प्रकार के लिए पूरी तरह परिवर्तनीय है।

लेकिन अगर मैं एक विधि है, जहां एक प्रकार Action और अन्य Func<object> की एक पैरामीटर है के दो भार के लिए है, और मैं इसे ऊपर से लैम्ब्डा गुजरती हैं, Func<object> अधिभार प्रयोग किया जाता है। क्यूं कर? विनिर्देश का कौन सा हिस्सा कहता है कि Func<object> इस मामले में Action से बेहतर है?

मैंने §7.5.3.2 बेहतर फ़ंक्शन सदस्य पर देखा है, लेकिन यह इसकी व्याख्या नहीं करता है।

+0

और अगर लौटने शून्य है लैम्ब्डा वाक्य रचना के बजाय, आप का उपयोग नोटेशन 'प्रतिनिधि {नई अपवाद() फेंक दें; } 'जहां आप'() 'कोष्ठक में पैरामीटर सूची छोड़ते हैं, वह अज्ञात फ़ंक्शन ** किसी भी ** प्रतिनिधि हस्ताक्षर से मेल खाता है, जिसमें मुझे लगता है, उदा। 'EventHandler' और' एक्शन <ऑब्जेक्ट, EventArgs> '। –

+0

@JeppeStigNielsen हाँ। उस स्थिति में, विधि पैरामीटर के रूप में उन्हें असंबद्ध करने का कोई नियम नहीं है, इसलिए आपको एक संकलन त्रुटि मिल जाएगी। – svick

उत्तर

11

मुझे एक सेक्शन को कम देखना चाहिए था: §7.5.3।अभिव्यक्ति से बेहतर रूपांतरण बताते हैं कि:

एक अंतर्निहित रूपांतरण C1 कि एक अभिव्यक्ति E से एक प्रकार T1, और एक अंतर्निहित रूपांतरण C2 कि एक अभिव्यक्ति E से एक प्रकार T2 में धर्मान्तरित करने के लिए धर्मान्तरित को देखते हुए, C1 है C2 तुलना में एक बेहतर रूपांतरण करता है, तो निम्न में से कम से कम एक रखती है:

  • ...

  • E, एक गुमनाम समारोह है T1 या तो एक प्रतिनिधि प्रकार D1 या एक अभिव्यक्ति पेड़ प्रकार Expression<D1> है, T2 है या तो एक प्रतिनिधि प्रकार D2 या एक अभिव्यक्ति पेड़ प्रकार Expression<D2> और निम्न में से एक रखती है:

    • ...

    • D1 और D2 समान पैरामीटर सूचियों है, और निम्न में से एक रखती है:

      • ...

      • D1 एक वापसी प्रकार Y है, और D2,

+1

आपने इस उत्तर को एक ही सेकंड में पोस्ट किया है जैसा आपने सवाल पूछा है? –

+6

हाँ, जब मैं सवाल लिख रहा था, मैंने कल्पना में जवाब देखा। तो मैं इस पर शोध करने के किसी भी समय बर्बाद नहीं करना चाहता था। लेकिन साथ ही, मैंने सोचा कि यह किसी और के लिए उपयोगी हो सकता है। – svick

+1

यह उत्तर बताता है कि मनाया व्यवहार कैसे spec फिट बैठता है, लेकिन यह नहीं (और नहीं कर सकता) समझाया गया है कि क्यों पहली जगह में कल्पना लिखा गया था। सौभाग्य से, [अब हमारे पास शब्द है] (http://stackoverflow.com/questions/24316189/peculiar-overload-resolution-with-while-true/24316474?noredirect=1#comment37681268_24316474) उस व्यक्ति से जिसने सुविधा लागू की है कंपाइलर भी बता रहा है! – Jon

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