मेरे पास 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()
लेकिन इस संकलक का मन बदल नहीं था ... मैं क्यों नहीं आश्चर्य)
IIRC, इस वजह से है एक घोषित करने के लिए 'घोषणा प्रकार' में पाया जा रहा है और यह आधार प्रकार पर आगे नहीं बढ़ता है। मैंने पहले एक समान सवाल पूछा। लिंक खोज रहे हैं। संपादित करें: यहां आप जाएं: http://stackoverflow.com/q/12242346/15541 (आपका प्रश्न डुप्लिकेट है) – leppie
दोह! वैसे यह 100% डुप्लिकेट नहीं है क्योंकि मेरा प्रश्न सामान्य जेनेरिक इंटरफ़ेस के बारे में है? '*' अनिवार्य बंद होने का इंतजार कर रहा है * – Qwertie
मुझे लगता है कि यह किसी भी प्रकार के लिए जाता है। – leppie