C #: Как Dictionary ‹K, V› может реализовать ICollection ‹KeyValuePair‹ K, V ›› без добавления (KeyValuePair ‹K, V›)?

Глядя на System.Collections.Generic.Dictionary<TKey, TValue>, он явно реализует ICollection<KeyValuePair<TKey, TValue>>, но не имеет требуемой функции «void Add(KeyValuePair<TKey, TValue> item)».

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

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

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

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

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


person David Schmitt    schedule 06.11.2008    source источник
comment
{новая KeyValuePair ‹строка, int› (muh, 2)}   -  person prabhakaran    schedule 21.03.2014


Ответы (3)


Ожидаемый 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).

person Marc Gravell    schedule 06.11.2008
comment
Ох, должен был это знать! - person David Schmitt; 06.11.2008

Некоторые методы интерфейса реализованы явно. Если вы используете отражатель, вы можете увидеть явно реализованные методы, а именно:

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();
person Pop Catalin    schedule 06.11.2008

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

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

person GeekyMonkey    schedule 06.11.2008
comment
Это на самом деле не отвечает на вопрос - он должен (чтобы быть действительным) все еще иметь такой метод Add - это явно явная реализация, а не часть API общедоступного класса. - person Marc Gravell; 06.11.2008