2008-11-06 14 views
11

En cuanto a System.Collections.Generic.Dictionary<TKey, TValue>, claramente implementa ICollection<KeyValuePair<TKey, TValue>>, pero no tiene la función "void Add(KeyValuePair<TKey, TValue> item)" requerida.C#: ¿Cómo puede Dictionary <K,V> implementar ICollection <KeyValuePair <K,V>> sin tener Add (KeyValuePair <K,V>)?

Esto también se puede ver cuando se trata de inicializar un Dictionary así:

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

el que falla con

No hay sobrecarga para el método 'Añadir' toma argumentos '1'

¿Por qué es así?

+0

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

Respuesta

17

La API esperada se agrega mediante el método de argumento Add(key,value) (o el indexador this[key]); como tal, utiliza una implementación de interfaz explícita para proporcionar el método Add(KeyValuePair<,>).

En su lugar, si utiliza la interfaz IDictionary<string, int>, tendrá acceso al método que falta (ya que no puede ocultar nada en una interfaz).

Además, con el inicializador de colección, tenga en cuenta que puede utilizar la sintaxis alternativa:

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

que utiliza el método Add(key,value).

+0

¡oh, debería haber sabido eso! –

9

Algunos métodos de interfaz están implementados explicitly. Si utiliza el reflector se puede ver los métodos implementados de manera explícita, que son:

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

¡Es bueno saberlo también! –

0

No implementa ICollection<KeyValuePair<K,V>> directamente. Implementa IDictionary<K,V>.

IDictionary<K,V> deriva de ICollection<KeyValuePair<K,V>>.

+0

Eso realmente no responde a la pregunta: debe (para ser válido) aún * tener * dicho método de Agregar, resulta que es una implementación explícita en lugar de parte de la API de clase pública. –

Cuestiones relacionadas