चलिए निम्नलिखित सरलीकृत उदाहरण हैं:जे # जेनरिक के साथ ओवरलोडिंग: बग या फीचर?
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);
}
यह ठीक काम करेगा। क्यों संकलक सही अधिभार का चयन नहीं करता है?
वास्तव में IENumerable और ICollection के बीच कोई रूपांतरण नहीं है। – nothrow
@Yossarian: दो चीजें। सबसे पहले, एक स्पष्ट रूपांतरण है। आप कहने का मतलब है "वास्तव में कोई अंतर्निहित संदर्भ रूपांतरण नहीं है"। दूसरा, सवाल यह नहीं है कि "मुझे कोई अंतर्निहित रूपांतरण क्यों नहीं मिल रहा है?" दूसरा, सवाल यह है कि "ओवरलोड रिज़ॉल्यूशन एल्गोरिदम एक सटीक-मिलान उम्मीदवार क्यों चुन रहा है जो वैध-लेकिन-बदतर उम्मीदवार को चुनने के बजाय अमान्य है जो ठीक से मेल नहीं खाता है?" –