2012-03-27 11 views
7

निम्न विधि हस्ताक्षर को देखते हुए, यह क्यों होता है जब पैरामीटर स्पष्ट रूप से संकलक नामित होता है, तो स्वचालित रूप से प्रकार का अनुमान लगाने में असमर्थ होता है? विजुअल स्टूडियो 2010 एसपी 1 इस प्रकार का अनुमान लगाने में सक्षम है और कोई चेतावनी या त्रुटियां नहीं दिखाता है।वैकल्पिक पैरामीटर के साथ जेनेरिक प्रकार का अनुमान लगाने में असमर्थ

IEnumerable<T> ExecuteCommand<T>(
    string commandText, 
    string connectionName = null, 
    Func<IDataRecord, T> converter = null) { ... } 

static SomeClass Create(IDataRecord record) { return new SomeClass(); } 

void CannotInferType() { 
    var a = ExecuteCommand(
     "SELECT blah", 
     "connection", 
     converter: Test.Create); 
} 

void CanInferType() { 
    var a = ExecuteCommand(
     "SELECT blah", 
     "connection", 
     Test.Create); 
} 

यह कॉलिंग CannotInferType में वर्णित है और जब यह संकलन करने का प्रयास कर संकलक CanInferType काम करता है में वर्णित के रूप की उम्मीद के रूप में यह बुला जबकि error CS0411: The type arguments for method 'Test.ExecuteCommand<T>(string, string, System.Func<System.Data.IDataRecord,T>)' cannot be inferred from the usage. Try specifying the type arguments explicitly. का उत्सर्जन करता है के रूप में।

ऊपर बताए अनुसार, विजुअल स्टूडियो स्वयं कोई समस्या नहीं रिपोर्ट करता है, और परिवर्तनीय a के लिए इंटेलिजेंस IEnumerable<SomeClass> दिखाता है लेकिन कुछ कारणों से यह संकलित नहीं होता है।

+0

यदि आपको एक छोटा लेकिन पूरा * उदाहरण दिया गया तो इससे मदद मिलेगी ... –

उत्तर

7

यह सी # 4 कंपाइलर में एक बग था। यह सी # 5 कंपाइलर में तय किया गया है।

मुझे संदेह है कि यह वैकल्पिक पैरामीटर नहीं है जो समस्या का कारण बन रहा है - यह नामित तर्क है। अपने पैरामीटर के लिए डिफ़ॉल्ट मानों को हटाने का प्रयास करें और मुझे संदेह है कि आपको अभी भी वही समस्या होगी। (वैकल्पिक पैरामीटर और नामांकित तर्कों के बीच अंतर करने के लायक है - वे दो अलग-अलग विशेषताएं हैं। इन्हें अक्सर एक साथ उपयोग किया जाता है, लेकिन निश्चित रूप से होना आवश्यक नहीं है।)

यह निष्कर्ष है जब मैं इस बग को भेजता था एरिक और मैड्स को रिपोर्ट:

using System; 

class Test 
{ 
    static void Foo<T>(Func<T> func) {} 

    static void Main() 
    { 
     // Works fine 
     Foo(() => "hello"); 

     // Type inference fails 
     Foo(func:() => "hello"); 
    } 
} 

सौभाग्य से यह अब सी # 5 बीटा संकलक में काम करता है।

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