2017-02-06 15 views
10

मान लीजिए मैं दो असंबंधित प्रकार और एक ही हस्ताक्षर के साथ दो विस्तार तरीकों लेकिन विभिन्न प्रकार के फिल्टर को परिभाषित किया है:सी # सामान्य विधि संकल्प एक अस्पष्ट कॉल त्रुटि के साथ विफल

public class Foo {} 
public class Bar {} 

public static class FooExtensions 
{ 
    public static TFoo Frob<TFoo>(this TFoo foo) where TFoo : Foo { } 
    public static TFoo Brob<TFoo>(this TFoo foo) where TFoo : Foo { } 
} 

public static class BarExtensions 
{ 
    public static TBar Frob<TBar>(this TBar bar) where TBar : Bar { } 
} 

फिर जब मैं new Foo().Frob(); बारे में मैं कोई त्रुटि मिलती है

error CS0121: The call is ambiguous between the following methods or properties: 'FooExtensions.Frob<TFoo>(TFoo)' and 'BarExtensions.Frob<TBar>(TBar)'

कोई समझा सकते हैं क्यों यह विफल रहता है और यह कैसे से बचने के लिए?

संपादित करें: यह वीएस2015 अपडेट 3 और वीएस2017 आरसी में होता है।

EDIT2:

new Foo() 
    .Frob() 
    .Brob() 
+0

स्वीकृत उत्तर सही है; मुझे लगता है कि आप यहां क्या कर रहे हैं एक बुरा अभ्यास है। कृपया ऑब्जेक्ट को विस्तारित करके, या सामान्य प्रकार टी को विस्तारित करके, * सब कुछ * का विस्तार करने वाले विस्तार विधियां न करें। लगभग हमेशा एक बेहतर डिज़ाइन होता है। इस मामले में, क्यों फू और बार का विस्तार नहीं करते? इन जेनेरिक बनाने के लिए क्या आकर्षक लाभ है? –

+0

@EricLippert, मैंने परिदृश्य को काफी सरल बना दिया है। हकीकत में, एक्सटेंशन विधियां 'टीएफयू' वापस आती हैं। यहां विचार है कि धारणात्मक एपीआई विधियां हैं जो कक्षा पदानुक्रम पर काम करती हैं। तो मैं 'नया फू()। फ्रोब()। ग्रोब()। ब्लॉब(); 'लिख सकता था। मुद्दा तब उठता है जब मेरे पास दो स्वतंत्र प्रकार होते हैं, लेकिन एक्सटेंशन विधियों के साथ समान क्रम में समान तर्क लेते हैं। –

उत्तर

11

एक सामान्य प्रकार पैरामीटर की बाधा विधि के हस्ताक्षर का हिस्सा नहीं है: विचार यहाँ धाराप्रवाह एपीआई है कि एक वर्ग पदानुक्रम पर काम करता है है। ये दो विधियां अनिवार्य रूप से एक संकल्प बिंदु से समान हैं; जब संकलक कॉल को हल करने का प्रयास करता है तो यह दो वैध तरीकों को देखता है और इसके पास बेहतर विकल्प चुनने का कोई तरीका नहीं है, इसलिए कॉल को संदिग्ध के रूप में चिह्नित किया जाता है।

आप इस समस्या के बारे में अधिक पढ़ सकते हैं here

+0

लिंक के लिए धन्यवाद; खुद मैने इससे बेहतर नहीं कहा होता। –

+3

@EricLippert आपके लिए बहुत धन्यवाद, यह समझना मुश्किल है कि मैंने भाषा के बारे में कितना सीखा है, और सामान्य रूप से प्रोग्रामिंग, अपने ब्लॉग को पढ़ना। – InBetween

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