2008-11-06 11 views
11

System.Collections.Generic.Dictionary<TKey, TValue> पर देखकर, यह स्पष्ट रूप से ICollection<KeyValuePair<TKey, TValue>> लागू करता है, लेकिन इसमें आवश्यक "void Add(KeyValuePair<TKey, TValue> item)" फ़ंक्शन नहीं है।सी #: शब्दकोश <K,V> कैसे हो सकता है Iollection <KeyValuePair <K,V>> बिना जोड़ें (KeyValuePair <K,V>) लागू करें?

यह भी जब एक Dictionary इस तरह से प्रारंभ करने की कोशिश कर देखा जा सकता है:

private const Dictionary<string, int> PropertyIDs = new Dictionary<string, int>() 
{ 
    new KeyValuePair<string,int>("muh", 2) 
}; 

जो

के साथ विफल विधि के लिए 'जोड़ें' कोई अधिभार लेता है '1' तर्क

ऐसा क्यों है?

+0

{नया KeyValuePair ("muh", 2)} – prabhakaran

उत्तर

17

अपेक्षित एपीआई दो तर्क Add(key,value) विधि (या this[key] सूचकांक) के माध्यम से जोड़ना है; इस प्रकार, यह Add(KeyValuePair<,>) विधि प्रदान करने के लिए स्पष्ट इंटरफ़ेस कार्यान्वयन का उपयोग करता है।

यदि आप इसके बजाय IDictionary<string, int> इंटरफ़ेस का उपयोग करते हैं, तो आपको अनुपलब्ध विधि तक पहुंच होगी (क्योंकि आप किसी इंटरफ़ेस पर कुछ भी छिपा नहीं सकते हैं)।

इसके अलावा, संग्रह प्रारंभकर्ता साथ, ध्यान दें कि आप विकल्प सिंटैक्स का उपयोग कर सकते हैं:

Dictionary<string, int> PropertyIDs = new Dictionary<string, int> { 
    {"abc",1}, {"def",2}, {"ghi",3} 
} 

जो Add(key,value) विधि का उपयोग करता।

+0

डी ओह, यह जानना चाहिए था! –

9

कुछ इंटरफ़ेस विधियां explicitly लागू की गई हैं।

void ICollection<KeyValuePair<TKey, TValue>>.Add(KeyValuePair<TKey, TValue> keyValuePair); 
bool ICollection<KeyValuePair<TKey, TValue>>.Contains(KeyValuePair<TKey, TValue> keyValuePair); 
void ICollection<KeyValuePair<TKey, TValue>>.CopyTo(KeyValuePair<TKey, TValue>[] array, int index); 
bool ICollection<KeyValuePair<TKey, TValue>>.Remove(KeyValuePair<TKey, TValue> keyValuePair); 
IEnumerator<KeyValuePair<TKey, TValue>> IEnumerable<KeyValuePair<TKey, TValue>>.GetEnumerator(); 
void ICollection.CopyTo(Array array, int index); 
void IDictionary.Add(object key, object value); 
bool IDictionary.Contains(object key); 
IDictionaryEnumerator IDictionary.GetEnumerator(); 
void IDictionary.Remove(object key); 
IEnumerator IEnumerable.GetEnumerator(); 
+0

भी जानना अच्छा है! –

0

यह ICollection<KeyValuePair<K,V>> सीधे लागू नहीं करता है: आप स्पष्ट रूप से लागू किया तरीकों, जो देख सकते हैं आप परावर्तक का उपयोग करते हैं। यह IDictionary<K,V> लागू करता है।

IDictionary<K,V>ICollection<KeyValuePair<K,V>> से निकला है।

+0

यह वास्तव में प्रश्न का उत्तर नहीं देता है - यह अभी भी होना चाहिए (वैध होना) अभी भी * इस तरह की एक विधि जोड़ें - यह सार्वजनिक वर्ग एपीआई के हिस्से के बजाय एक स्पष्ट कार्यान्वयन होता है। –

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