2013-02-22 21 views
8

समाधान नहीं कर पाता मैं जैसे एक विधि है:क्यों संकलक इन सामान्य प्रकार

public void Foo<T1, T2>(T1 list) 
    where T1 : IList<T2> 
    where T2 : class 
{ 
    // Do stuff 
} 

अब अगर मैं है:

IList<string> stringList = new List<string>(); 
List<object> objectList = new List<object>(); 
IList<IEnumerable> enumerableList = new List<IEnumerable>(); 

फिर संकलक जेनरिक चयन करने के लिए समाधान नहीं कर सकता और यह विफल:

Foo(stringList); 
Foo(objectList); 
Foo(enumerableList); 

और आप स्पष्ट रूप से इस तरह के रूप में उपयोग करने जेनरिक निर्दिष्ट करने के लिए है:

Foo<IList<string>, string>(stringList); 
Foo<IList<object>, object>(objectList); 
Foo<List<object>, object>(objectList); 
Foo<IList<IEnumerable>, IEnumerable>(enumerableList); 
+8

साइड टिप्पणी, लेकिन क्या आपको वास्तव में 'टी 1' की आवश्यकता है? क्या आप 'सार्वजनिक शून्य Foo (IList सूची) नहीं कर सकते थे, जहां टी: कक्षा'? –

+1

संभावित डुप्लिकेट [जेनेरिक एक्सटेंशन विधि के साथ कोई प्रकार अनुमान नहीं] [http://stackoverflow.com/questions/7171067/no-type-inference-with-generic-extension-method) –

+0

लिंक किए गए प्रश्न में एरिक्स का उत्तर जांचें और ब्लॉग पोस्ट उसमें जुड़ा हुआ है। –

उत्तर

5

जेनेरिक विधि प्रकार निष्कर्ष जानबूझकर करता नहीं की कमी से किसी भी कटौती कर सकते हैं। इसके बजाय, तर्क और औपचारिक पैरामीटर से कटौती की जाती है, और उसके बाद निर्धारित प्रकार के तर्क बाधाओं के खिलाफ चेक किए जाते हैं।

:

की कमी और कई दर्जन मुझे बता कि मुझे लगता है कि करने के लिए है कि मौजूदा डिजाइन समझदार है गलत हूँ लोगों सहित विधि हस्ताक्षर, चारों ओर डिजाइन मुद्दों में से कुछ की विस्तृत चर्चा के लिए, इस विषय पर मेरे लेख को देखने के

http://blogs.msdn.com/b/ericlippert/archive/2009/12/10/constraints-are-not-part-of-the-signature.aspx

यह Eric Lippert's answer to a similar question की एक सटीक प्रति है।
मैंने इसे कॉपी करने का निर्णय लिया, क्योंकि यह प्रश्न अधिक संक्षिप्त और स्पष्ट है।

+0

अब हम मूल प्रश्न को डुप्लिकेट के रूप में बंद कर सकते हैं :-) –

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