С#: Как словарь <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)
};
который терпит неудачу с
Нет перегрузки для метода 'Добавить' принимает '1' аргументы
Почему это так?
Ответы
Ответ 1
Ожидаемый 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)
.
Ответ 2
Некоторые методы интерфейса реализованы явно. Если вы используете рефлектор, вы можете увидеть явно реализованные методы, которые:
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();
Ответ 3
Он не реализует ICollection<KeyValuePair<K,V>>
напрямую. Он реализует IDictionary<K,V>
.
IDictionary<K,V>
происходит от ICollection<KeyValuePair<K,V>>
.