2013-04-11 4 views
8

मेरे पास IDictionary<object, object> शामिल एक अजीब कारण के लिए एक इकाई परीक्षण विफल रहा था।यह अधिभार समाधान कैसे समझता है?

IDictionary<K,V> में दो Remove विधियां हैं। एक K लेता है, दूसरा KeyValuePair<K,V> लेता है। दो इन शब्दकोशों पर विचार करें:

IDictionary<string, object> d1 = new Dictionary<string, object>(); 
IDictionary<object, object> d2 = new Dictionary<object, object>(); 
d1.Add("1", 2); 
d2.Add("1", 2); 
Console.WriteLine(d1.Remove(new KeyValuePair<string, object>("1", 2))); 
Console.WriteLine(d2.Remove(new KeyValuePair<object, object>("1", 2))); 

उत्पादन True, False है तो। चूंकि KeyValuePair<object,object>d2.Remove(KeyValuePair<object,object>) द्वारा अपेक्षित सटीक प्रकार है, इसलिए संकलक d2.Remove(object) क्यों कॉल करता है?

(पोस्टमार्टम ध्यान दें:

परिदृश्य है कि मेरे सवाल का संकेत दिए जाने में, मैं IDictionary<object,object> सीधे बल्कि का उपयोग नहीं किया गया था एक सामान्य पैरामीटर के माध्यम से:

public class DictionaryTests<DictT> where DictT : 
    IDictionary<object,object>, new() 

के बाद से समस्या यह है कि है IDictionary ने ICollection से अधिक प्राथमिकता ली है, मैंने बाधाओं की सूची में ICollection सहित "चीजें भी बाहर" करने का निर्णय लिया:

public class DictionaryTests<DictT> where DictT : 
    ICollection<KeyValuePair<object, object>>, IDictionary<object,object>, new() 

लेकिन इस संकलक का मन बदल नहीं था ... मैं क्यों नहीं आश्चर्य)

+4

IIRC, इस वजह से है एक घोषित करने के लिए 'घोषणा प्रकार' में पाया जा रहा है और यह आधार प्रकार पर आगे नहीं बढ़ता है। मैंने पहले एक समान सवाल पूछा। लिंक खोज रहे हैं। संपादित करें: यहां आप जाएं: http://stackoverflow.com/q/12242346/15541 (आपका प्रश्न डुप्लिकेट है) – leppie

+0

दोह! वैसे यह 100% डुप्लिकेट नहीं है क्योंकि मेरा प्रश्न सामान्य जेनेरिक इंटरफ़ेस के बारे में है? '*' अनिवार्य बंद होने का इंतजार कर रहा है * – Qwertie

+0

मुझे लगता है कि यह किसी भी प्रकार के लिए जाता है। – leppie

उत्तर

2

समस्या का समाधान प्रदान करने के लिए (देखें टिप्पणी भी):।

Console.WriteLine( 
    ((ICollection<KeyValuePair<object, object>) d2). 
     Remove(new KeyValuePair<object, object>("1", 2))); 
+0

वायर्ड, इस बारे में नहीं सोचा था। – Tigran

+0

@ टिग्रान: हाँ, यह मुझे भी आश्चर्य से पकड़ा (और कई चीजें नहीं करते हैं!) – leppie

+0

ऐसा लगता है कि एक कंपाइलर चेतावनी के योग्य है, शायद इसे छोड़कर, क्योंकि यह डिज़ाइन और सभी के द्वारा है। मुझे आश्चर्य है कि क्या कुछ समस्या है कि सी # डिजाइनरों को इस नियम के साथ हल करने का इरादा है। – Qwertie

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