2011-12-08 34 views
6

क्या कोई समझा सकता है, निम्नलिखित कोड त्रुटि उत्पन्न क्यों करता है? 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I1)' और 'ConsoleApplication1.Program.M1<ConsoleApplication1.Base1>(ConsoleApplication1.Base1, ConsoleApplication1.I2)' यह कॉल संदिग्ध क्यों है?

मैं: (माइक्रोसॉफ्ट विजुअल स्टूडियो 2008 में संकलन)

class Base1 { }; 
class Base2 { } 

interface I1 { } 
interface I2 { } 

class C : I1, I2 { } 

static class Program 
{ 

    static T M1<T>(this T t, I1 x) where T : Base1 
    { 
     return t; 
    } 

    static T M1<T>(this T t, I2 x) where T : Base2 
    { 
     return t; 
    } 

    static void Main(string[] args) 
    { 
     Base1 b1 = new Base1(); 
     C c = new C(); 
     b1.M1(c); 
    } 
} 

त्रुटि

कॉल निम्न विधियों या गुणों के बीच अस्पष्ट है सोचा कि संकलक "कहां" खंडों का उपयोग करके दो विधियों के बीच अंतर कर सकता है

+0

मुझे नहीं लगता कि जेनेरिक बाधाएं विधि हस्ताक्षर के हिस्से के रूप में अर्हता प्राप्त करती हैं। – oscilatingcretin

+0

जेनेरिक बाधाएं ओवरलोड रिज़ॉल्यूशन में भाग नहीं लेती हैं। – Oded

+0

दुर्भाग्य से यह एक डुप्लिकेट प्रश्न है। इसका अर्थ यह है कि व्यावहारिक मिलान विधि ओवरलोड को खोजने पर सामान्य बाधाओं पर विचार नहीं किया जाता है, और संकलक उन पर विचार करने से पहले विफल रहता है। एसओ पर पहले से ही इस बारे में कई सवाल हैं, मुझे बस सही खोजशब्द खोजना होगा। –

उत्तर

13

बाधाएं विधियों के लिए हस्ताक्षर का हिस्सा नहीं हैं और इस प्रकार संकल्प के लिए उपयोग नहीं किया जाता है।

0

एसोसिएशन को हल करने के लिए बाधा का उपयोग नहीं किया जा सकता है।

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