मैं एक शब्दकोश-जैसी वस्तु बनाना चाहता था और सोचा था कि 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>();
का उपयोग कर समाप्त हो गया।
यह मेरा पहला अनुमान था। क्या आप जानते हैं कि यह एमएसडीएन दस्तावेज में क्यों निर्दिष्ट नहीं है? इसके अलावा, उन्होंने उन तरीकों को क्यों छुपाया? –
@the_drow, मुझे यकीन नहीं है कि वे दस्तावेज़ में उस भेद को क्यों नहीं बनाते हैं और न ही मैं 100% सुनिश्चित करता हूं कि उन्होंने चुनाव क्यों किया। उत्तरार्द्ध के लिए मेरा पहला वृत्ति यह है कि वे डिफ़ॉल्ट रूप से जोड़ें का एक ओवरलोड लोड करना चाहते थे। – JaredPar
@the_drow: यह वास्तव में एमएसडीएन दस्तावेज में निर्दिष्ट है। आपको बस "स्पष्ट इंटरफ़ेस कार्यान्वयन" – Daniel