अनुमति नहीं मैं हाल ही में यह लिखा और आश्चर्य हुआ कि यह संकलित:जेनेरिक्स अनुमति की ओर जाता है और अस्पष्टता
public class MyGeneric<U, V> {
MyGeneric(U u) { ... }
MyGeneric(V v) { ... }
public void Add(U u, V v) { ... }
public void Add(V v, U u) { ... }
}
इस प्रकार अगर मैं इस वर्ग का उपयोग करें, मैं एक "अस्पष्ट निर्माता संदर्भ" मिल और यदि मैं जोड़ता हूं तो एक "संदिग्ध आमंत्रण"।
var myVar = new MyGeneric<int, int>(new MyIntComparer());
जाहिर है, वहाँ कोई अस्पष्टता नहीं है जब मैं सामान्य प्रकार के रूप में पूर्णांक और डबल का उपयोग, ज़ाहिर है को छोड़कर जब मैं दोनों ints है, जो भी दोनों एक डबल करने के लिए आवंटित होगा का उपयोग करें।
var myVar = new MyGeneric<int, double>(new MyIntComparer());
myVar.Add(3, 5);
तो मैंने सोचा कि निम्नलिखित की अनुमति भी थी, लेकिन आश्चर्य की बात है कि मुझे एक त्रुटि मिली। निम्नलिखित संकलन करने की अनुमति क्यों नहीं है?
public interface IMyInterface<T, S> {
void Add(T t, S s);
}
public class MyGeneric<U, V> : IMyInterface<U, V>, IMyInterface<V, U> {
public MyGeneric(U u) { }
public MyGeneric(V v) { }
void IMyInterface<U, V>.Add(U u, V v) { ... }
void IMyInterface<V, U>.Add(V v, U u) { ... }
}
बावजूद अगर मैं अस्पष्ट या स्पष्ट इंटरफेस कार्यान्वयन का उपयोग, संकलक कहा गया है कि
'MyGeneric < यू, वी >' दोनों 'IMyInterface < यू, वी >' और 'IMyInterface लागू नहीं कर सकते < वी, यू > 'क्योंकि वे कुछ प्रकार पैरामीटर प्रतिस्थापन
और पहले एलो क्यों हैं लिखने के लिए wed?
हालांकि [इन] (http://blogs.msdn.com/b/ericlippert/archive/2006/04/05/odious-ambiguous-overloads-part-one.aspx) [दो] (http: // blogs.msdn.com/b/ericlippert/archive/2006/04/06/odious-ambiguous-overloads-part-two.aspx) ब्लॉग पोस्ट उस मामले के बारे में बात कर रहे हैं जहां एक सामान्य विधि और एक गैर-सामान्य विधि समाप्त हो सकती है कुछ प्रकार के तर्कों के लिए एक ही हस्ताक्षर के साथ, वे आपके दो-प्रकार-तर्क मामले पर भी लागू हो सकते हैं। (इसका उत्तर दिया गया है कि यह क्यों अनुमति है, अनिवार्य रूप से "हमने इसे सी # 2.0 में अनुमति दी है और अब इसे बदलने में बहुत देर हो चुकी है"। – Rawling
इन लिंक के लिए धन्यवाद, यह संकलक का कार्यान्वयन स्पष्टीकरण है जिसे मैं – AlexH
@ राउलिंग, दिलचस्प लिंक के लिए धन्यवाद। – Andreas