2008-11-06 3 views
11

Глядя на System.Collections.Generic.Dictionary<TKey, TValue>, он четко реализует ICollection<KeyValuePair<TKey, TValue>>, но не имеет функции «void Add(KeyValuePair<TKey, TValue> item)».C#: Как можно использовать словарь <K,V> ICollection <KeyValuePair <K,V>> без добавления (KeyValuePair <K,V>)?

Это также можно увидеть при попытке инициализировать Dictionary так:

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

, который не терпит неудачу с

Нет перегрузки для метода 'Add' принимает аргументы '1'

Почему это так?

+0

{new KeyValuePair ("muh", 2)} – prabhakaran 2014-03-21 05:58:14

ответ

17

Ожидаемый API должен добавить через два аргумента метод 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

d oh, должно было это знать! – 2008-11-06 09:39:43

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

Полезно знать, тоже! – 2008-11-06 09:47:34

0

Он не реализует ICollection<KeyValuePair<K,V>> напрямую. Он реализует IDictionary<K,V>.

IDictionary<K,V> происходит от ICollection<KeyValuePair<K,V>>.

+0

Это действительно не отвечает на вопрос - он должен (чтобы быть действительным) все еще * иметь * такой метод Add - это juts - это явная реализация, а не часть API открытого класса. – 2008-11-06 09:56:26

 Смежные вопросы

  • Нет связанных вопросов^_^