2011-08-26 12 views
25

मैं एक शब्दकोश-जैसी वस्तु बनाना चाहता था और सोचा था कि IDictionary<K,V> इंटरफ़ेस को कार्यान्वित करने का सही तरीका होगा, और अंतर्निहित शब्दकोश को शामिल करने के लिए संरचना का उपयोग करें। मैं नीचे (K = string, V = int)सी # डिक्शनरी सभी IDictionary क्यों लागू नहीं करता है?

public class DictionaryLikeObject : IDictionary<string,int> { 
    Dictionary<string,int> _backingDictionary = new Dictionary<string,int>(); 
} 

तो मैं दृश्य स्टूडियो की 'लागू इंटरफेस "सभी कवर तरीकों कि मैं की आवश्यकता होगी बाहर ठूंठ करने की क्षमता का इस्तेमाल किया के साथ शुरू हुआ।

IDictionary के तीन तरीकों Dictionary में मौजूद नहीं हैं:

void Add(KeyValuePair<string, int> item); 
void CopyTo(KeyValuePair<string, int>[] array, int arrayIndex); 
bool Remove(KeyValuePair<string, int> item); 

फिर भी the Microsoft documentation स्पष्ट रूप से इंगित करता है कि Dictionary लागू करता IDictionary। तो मैं इन तीन तरीकों से उपलब्ध होने की उम्मीद करता। , प्रलेखन से कॉपी करने के लिए Dictionary<K,V>

[SerializableAttribute] 
[ComVisibleAttribute(false)] 
public class Dictionary<K, V> : IDictionary<K, V>, 
ICollection<KeyValuePair<K, V>>, IEnumerable<KeyValuePair<K, V>>, 
IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback 

इन तीन लापता तरीकों की परिभाषा, मुझे विश्वास है, ICollection<> में पाए जाते हैं। लेकिन Clear() जैसी अन्य विधियां भी हैं जो Dictionary है।

प्रश्न 1: सी # इन तीनों को लागू किए बिना कैसे दूर हो सकता है, और ऐसा क्यों है? मुझे संदेह है कि यह एक कंपाइलर त्रुटि है (मेरे तर्क के लिए, नीचे देखें)। प्रश्न 2: वैकल्पिक रूप से, मुझे क्या याद आ रही है?

यहां मुझे लगता है कि यह एक कंपाइलर त्रुटि हो सकती है। निम्नलिखित कोड का परीक्षण करें:

Dictionary<string, int> dictionary1 = new Dictionary<string, int>(); 
IDictionary<string, int> dictionary2 = new Dictionary<string, int>(); 
KeyValuePair<string, int> item = new KeyValuePair<string, int>("test", 1); 
//dictionary1.Add(item); // compile error: No overload for method 'Add' takes 1 argument 
dictionary2.Add(item); // works like a charm 
Debug.WriteLine(@"dictionary2[""test""] = {0}", dictionary2["test"]); // outputs: dictionary2["test"] = 1 

विधि void Add(KeyValuePair<string, int> item) (क्योंकि यह संकलन नहीं करता है) Dictionary<string,int> में नहीं दिखाई देता है, लेकिन यह IDictionary<string,int> में है, और किसी भी तरह संकलक ठीक से यह के एक कार्यान्वयन मिल रहा है। प्रश्न 3: क्या चल रहा है?

ध्यान दें कि Dictionary<K,V> के लिए Microsoft दस्तावेज़ इन तीन विधियों को निर्दिष्ट नहीं करता है।

अन्त में, मेरी वास्तविक क्रियान्वयन में, मैं इतना है कि तीनों विधियों आसानी से काम कर सकता था

IDictionary<string,int> _backingDictionary = new Dictionary<string,int>(); 

बजाय

Dictionary<string,int> _backingDictionary = new Dictionary<string,int>(); 

का उपयोग कर समाप्त हो गया।

उत्तर

44

Dictionary<TKey, TValue> इन विधियों को लागू करता है, यह इतना स्पष्ट रूप से करता है। इसलिए आपको इसे IDictionary<TKey, TValue> इंटरफ़ेस के माध्यम से एक्सेस करना होगा।

Dictionary<string, string> map = ...; 
KeyValuePair<string, string> pair = ...; 
map.Add(pair); // Compilation Error 
((IDictionary<string, string>)map).Add(pair); // Works 

स्पष्टीकरण के बिंदु पर सटीक कार्यान्वयन विधि एक उदाहरण विधि लागू करने के लिए स्पष्ट कार्यान्वयन कार्य करता है। उदाहरण के लिए

interface IFoo { 
    void Method(); 
} 

class C1 : IFoo { 
    // Implicitly implements IFoo.Method 
    public void Method() { } 
} 

class C2 : IFoo { 
    // Explicitly implements IFoo.Method 
    void IFoo.Method() { } 
} 
+1

यह मेरा पहला अनुमान था। क्या आप जानते हैं कि यह एमएसडीएन दस्तावेज में क्यों निर्दिष्ट नहीं है? इसके अलावा, उन्होंने उन तरीकों को क्यों छुपाया? –

+0

@the_drow, मुझे यकीन नहीं है कि वे दस्तावेज़ में उस भेद को क्यों नहीं बनाते हैं और न ही मैं 100% सुनिश्चित करता हूं कि उन्होंने चुनाव क्यों किया। उत्तरार्द्ध के लिए मेरा पहला वृत्ति यह है कि वे डिफ़ॉल्ट रूप से जोड़ें का एक ओवरलोड लोड करना चाहते थे। – JaredPar

+6

@the_drow: यह वास्तव में एमएसडीएन दस्तावेज में निर्दिष्ट है। आपको बस "स्पष्ट इंटरफ़ेस कार्यान्वयन" – Daniel

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