2011-09-13 10 views
7

मैं निम्नलिखित कोड है गुजर के आधार पर:सी # का अनुमान लगा सामान्य प्रकार एक प्रतिनिधि

public static class X 
{ 
    public static C Test<A,B,C>(this A a, Func<B,C> f) 
     where C:class 
    { 
     return null; 
    } 

} 

public class Bar 
{ 
    public Bar() 
    { 
     this.Test(foo); //this doesn't compile 
     this.Test((Func<int, string>)foo); 
     this.Test((int q) => "xxx"); 
    } 

    string foo(int a) { return ""; } 
} 

चिह्नित लाइन क्यों संकलन नहीं करता है? क्या रिटर्न प्रकार के साथ हस्ताक्षर का हिस्सा नहीं है?
लेकिन तीसरी लाइन संकलित करता है, जो मुझे लगता है कि संकलक कुछ दूसरी पंक्ति के समान में बदल जाता है ...

+1

[सी # 3.0 जेनेरिक प्रकार अनुमान के संभावित डुप्लिकेट - एक फ़ंक्शन पैरामीटर के रूप में एक प्रतिनिधि को पास करना] (http://stackoverflow.com/questions/407983/c-3-0-generic-type-inference-passing-a- प्रतिनिधि-ए-ए-फ़ंक्शन-पैरामीटर) उन उत्तरों को पढ़ें, वे एक विस्तृत स्पष्टीकरण देंगे। –

उत्तर

7

असल में, प्रकार निष्कर्ष प्रक्रिया कल्पना की धारा 7.5.2 में वर्णित अपेक्षाकृत है विधि समूह रूपांतरणों की बात आती है जब कमजोर।

यह कदम [विधि समूह उत्पादन प्रकार निष्कर्ष] केवल अगर सब विधि प्रकार लागू होता है: - विधि समूहों सहित - एनोटेट मानक, खंड 7.5.2.6 जो आउटपुट प्रकार अनुमान के बारे में बात में में व्लादिमिर Reshetnikov से एक एनोटेशन इस बात का उल्लेख प्रतिनिधि पैरामीटर प्रकारों में होने वाले पैरामीटर पहले ही तय किए गए हैं। ओवरलोड रिज़ॉल्यूशन अपूर्ण प्रकार की जानकारी के आधार पर सर्वोत्तम विधि का चयन करने का प्रयास नहीं करता है।

मुझे विश्वास है कि यह वास्तव में यहां समस्या है - निश्चित रूप से, आपको केवल एक विधि मिल गई है जिसे आप कॉल कर सकते हैं और विधि समूह में केवल एक ही विधि है, लेकिन टाइप अनुमान प्रक्रिया टाई के लिए काफी शक्तिशाली नहीं है दोनों एक साथ।

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