2010-04-06 7 views
8

चलिए निम्नलिखित सरलीकृत उदाहरण हैं:जे # जेनरिक के साथ ओवरलोडिंग: बग या फीचर?

void Foo<T>(IEnumerable<T> collection, params T[] items) 
{ 
    // ... 
} 

void Foo<C, T>(C collection, T item) 
    where C : ICollection<T> 
{ 
    // ... 
} 

void Main() 
{ 
    Foo((IEnumerable<int>)new[] { 1 }, 2); 
} 

कंपाइलर कहता है:

प्रकार 'System.Collections.Generic.IEnumerable' सामान्य प्रकार या विधि में प्रकार पैरामीटर 'सी' के रूप में उपयोग नहीं किया जा सकता है 'UserQuery.Foo (सी, टी)'। 'System.Collections.Generic.IEnumerable' से 'System.Collections.Generic.icollection' से कोई अंतर्निहित संदर्भ रूपांतरण नहीं है।

अगर मैं Main को बदलता हूं:

void Main() 
{ 
    Foo<int>((IEnumerable<int>)new[] { 1 }, 2); 
} 

यह ठीक काम करेगा। क्यों संकलक सही अधिभार का चयन नहीं करता है?

+0

वास्तव में IENumerable और ICollection के बीच कोई रूपांतरण नहीं है। – nothrow

+1

@Yossarian: दो चीजें। सबसे पहले, एक स्पष्ट रूपांतरण है। आप कहने का मतलब है "वास्तव में कोई अंतर्निहित संदर्भ रूपांतरण नहीं है"। दूसरा, सवाल यह नहीं है कि "मुझे कोई अंतर्निहित रूपांतरण क्यों नहीं मिल रहा है?" दूसरा, सवाल यह है कि "ओवरलोड रिज़ॉल्यूशन एल्गोरिदम एक सटीक-मिलान उम्मीदवार क्यों चुन रहा है जो वैध-लेकिन-बदतर उम्मीदवार को चुनने के बजाय अमान्य है जो ठीक से मेल नहीं खाता है?" –

उत्तर

15

आपके प्रश्न का उत्तर यहां दिया गया है।

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

कृपया यह भी लगभग एक लाख की टिप्पणियां मुझे बता कि मैं इस मुद्दे पर कुछ दिलचस्प अतिरिक्त टिप्पणी के लिए गलत हूँ पढ़ें।

+0

ठीक है। त्वरित उत्तर के लिए धन्यवाद :) मुझे उत्तर स्वीकार करने से पहले मुझे लंबे समय तक इंतजार करना होगा :) –

+0

मुझे पता था कि मैंने यह लेख पढ़ा है और मैं इसकी तलाश कर रहा था ... लेकिन जाहिर है आप अपने ब्लॉग को मुझसे बेहतर जानते हैं और लेखों को तेजी से ढूंढें - जो कि तरह का मेला है ... ^^ – tanascius

2

मेरा अनुमान है कि संकलक सामान्य बाधा का उपयोग करने से पहले सबसे अच्छा मैच चुनता है। आपके उदाहरण में बाधा के साथ विधि बेहतर है क्योंकि इसमें params अंतिम पैरामीटर नहीं है।

संपादित करें - एरिक लिपर्ट ने इसे अपने उत्तर में पुष्टि की।

+0

हां। आपको भी धन्यवाद:) –