Possible Duplicate:
Why is Func<T> ambiguous with Func<IEnumerable<T>>?जेनेरिक्स, अधिभार संकल्प और प्रतिनिधियों (क्षमा करें, एक बेहतर शीर्षक नहीं मिल सकता है)
मैं जेनरिक के साथ एक बहुत अजीब अधिभार संकल्प मुद्दा ...
पर विचार करें निम्न विधियों देखा:
static void Foo<TSource>(TSource element, Func<TSource, int> selector)
{
"int".Dump();
}
static void Foo<TSource>(TSource element, Func<TSource, double> selector)
{
"double".Dump();
}
static T Identity<T>(T value)
{
return value;
}
(सी # 4, LINQPad में परीक्षण)
अगर मैं चयनकर्ता के रूप में एक लैम्ब्डा अभिव्यक्ति के साथ Foo
कॉल करने के लिए कोशिश , सब कुछ ठीक काम करता है:
Foo(42, x => x); // prints "int"
लेकिन अगर मैं Identity
साथ x => x
की जगह, संकलक 2 Foo
भार के बीच तय नहीं कर सकते हैं:
Foo(42, Identity);
// The call is ambiguous between the following methods or properties:
// 'UserQuery.Foo<int>(int, System.Func<int,int>)' and
// 'UserQuery.Foo<int>(int, System.Func<int,double>)'
कैसे दूसरे अधिभार एक वैध उम्मीदवार हो सकता है? प्रकार निष्कर्ष सही ढंग से निर्धारित करता है कि TSource
int
है, इसलिए Identity
विधि के लिए T
पैरामीटर int
रूप में अच्छी तरह हो गया है, तो वापसी प्रकार int
भी ... Identity
एक Func<int,int>
या एक Func<double,double>
, लेकिन नहीं एक Func<int,double>
हो सकता है हो गया है!
और यह और भी खराब हो जाता है!
Foo<int>(42, Identity<int>); // The call is ambiguous...
कैसे यहाँ कोई अस्पष्टता नहीं हो सकता: यहां तक कि अगर मैं सभी प्रकार पैरामीटर स्पष्ट रूप से निर्दिष्ट, मैं अभी भी एक ही त्रुटि मिलती है? जहां तक मैं कह सकता हूं, Func<int,double>
ले जाने वाला अधिभार कोई उम्मीदवार नहीं हो सकता है। मुझे लगता है कि स्पष्टीकरण विनिर्देशों में कहीं कहीं होना चाहिए, लेकिन मुझे प्रासंगिक बिट नहीं मिल रहा है ... या यह संकलक में एक बग हो सकता है, लेकिन मुझे लगता है कि यह असंभव है।
ध्यान दें कि यह अगर मैं स्पष्ट रूप से प्रतिनिधि बनाने के काम करता है:
Foo(42, new Func<int, int>(Identity)); // prints "int"
तो, किसी को समझा सकता है यहाँ क्या हो रहा है? इसके अलावा, यह लैम्ब्डा के साथ क्यों काम करता है लेकिन विधि समूह के साथ नहीं?
धैर्यपूर्वक एरिक लिपर्ट के लिए * उत्तर * पोस्ट करने का इंतजार कर रहा है। –
सी # 3 के तहत क्या होता है? मुझे संदेह है कि जेनेरिक में टाइप वैरिएंस के साथ ऐसा कुछ हो सकता है। –
@Anon, मैंने सी # 3 के साथ प्रयास नहीं किया, लेकिन मुझे नहीं लगता कि इसका भिन्नता के साथ कुछ भी नहीं है, क्योंकि भिन्नता मान प्रकार –