2008-11-06 8 views
11

Betrachtet man System.Collections.Generic.Dictionary<TKey, TValue>, implementiert es eindeutig ICollection<KeyValuePair<TKey, TValue>>, hat aber nicht die erforderliche Funktion "void Add(KeyValuePair<TKey, TValue> item)". C#: Wie kann Dictionary <K,V> ICollection implementieren <KeyValuePair <K,V>> ohne Add (KeyValuePair <K,V>)?

Dies kann auch gesehen werden, wenn ein Dictionary so zu initialisieren versuchen:

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

, die mit

Keine Überlastung für Methode versagt 'Add' nimmt '1' Argumente

Warum ist das so?

+0

{neue KeyValuePair ("muh", 2)} – prabhakaran

Antwort

17

Die erwartete API ist über die zwei Argumente Add(key,value) Methode (oder this[key] Indexer) hinzuzufügen; als solches verwendet es eine explizite Schnittstellenimplementierung, um die Add(KeyValuePair<,>)-Methode bereitzustellen.

Wenn Sie stattdessen die Schnittstelle IDictionary<string, int> verwenden, haben Sie Zugriff auf die fehlende Methode (da Sie nichts an einer Schnittstelle verbergen können).

Auch mit den Auflistungsinitialisierer, beachten Sie, dass Sie die alternative Syntax verwenden:

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

die die Add(key,value) Methode verwendet.

+0

d'oh, sollte das gewusst haben! –

9

Einige Schnittstellenmethoden sind implementiert explicitly. Wenn Sie Reflektor verwenden können Sie die explizit implementierten Methoden sehen, die da sind:

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

Gut zu wissen! –

0

Es ist nicht ICollection<KeyValuePair<K,V>> direkt nicht implementiert. Es implementiert IDictionary<K,V>.

IDictionary<K,V> stammt von ICollection<KeyValuePair<K,V>>.

+0

Das beantwortet nicht wirklich die Frage - es muss (um gültig zu sein) immer noch * eine solche Add-Methode haben - es ist eine explizite Implementierung und kein Teil der öffentlichen Klassen-API. –

Verwandte Themen