valor recorrer obtener new leer ejemplos diccionario consultar buscar c# dictionary idictionary

recorrer - ¿Por qué el diccionario C#no implementa todo IDictionary?



obtener valor de un diccionario c# (1)

Quería crear un objeto similar a un Diccionario y pensé que la forma correcta sería implementar la IDictionary<K,V> y usar la composición para incluir el diccionario subyacente. Comencé con lo siguiente ( K = string , V = int )

public class DictionaryLikeObject : IDictionary<string,int> { Dictionary<string,int> _backingDictionary = new Dictionary<string,int>(); }

Luego usé la capacidad de "Implementar interfaz" de Visual Studio para eliminar todos los métodos de cobertura que necesitaría.

Tres métodos de IDictionary no parecen existir en el Dictionary :

void Add(KeyValuePair<string, int> item); void CopyTo(KeyValuePair<string, int>[] array, int arrayIndex); bool Remove(KeyValuePair<string, int> item);

Sin embargo, la documentación de Microsoft indica claramente que el Dictionary implementa IDictionary . Así que habría esperado que estos tres métodos estuvieran disponibles. Para copiar de la documentación, la definición de Dictionary<K,V>

[SerializableAttribute] [ComVisibleAttribute(false)] public class Dictionary<K, V> : IDictionary<K, V>, ICollection<KeyValuePair<K, V>>, IEnumerable<KeyValuePair<K, V>>, IDictionary, ICollection, IEnumerable, ISerializable, IDeserializationCallback

Estos tres métodos faltantes, creo, se encuentran en ICollection<> . Pero también lo son otros métodos como Clear() que tiene el Dictionary .

Pregunta 1: ¿Cómo puede C # escapar sin implementar estos tres, y por qué es así? Sospecho que esto es un error del compilador (para mi razonamiento, ver más abajo). Pregunta 2: Alternativamente, ¿qué me estoy perdiendo?

He aquí por qué creo que podría ser un error del compilador. Examina el siguiente código:

Dictionary<string, int> dictionary1 = new Dictionary<string, int>(); IDictionary<string, int> dictionary2 = new Dictionary<string, int>(); KeyValuePair<string, int> item = new KeyValuePair<string, int>("test", 1); //dictionary1.Add(item); // compile error: No overload for method ''Add'' takes 1 argument dictionary2.Add(item); // works like a charm Debug.WriteLine(@"dictionary2[""test""] = {0}", dictionary2["test"]); // outputs: dictionary2["test"] = 1

El método void Add(KeyValuePair<string, int> item) parece no estar en Dictionary<string,int> (ya que no se compila), pero está en IDictionary<string,int> , y de alguna manera el compilador funciona correctamente Encuentra una implementación de ello. Pregunta 3: ¿Qué está pasando?

Tenga en cuenta que la documentación de Microsoft para el Dictionary<K,V> no especifica estos tres métodos.

Por último, en mi implementación real, terminé usando

IDictionary<string,int> _backingDictionary = new Dictionary<string,int>();

en lugar de

Dictionary<string,int> _backingDictionary = new Dictionary<string,int>();

para que los tres métodos puedan funcionar fácilmente.


El Dictionary<TKey, TValue> implementa estos métodos, simplemente lo hace explícitamente. Por lo tanto, debe acceder a través de la IDictionary<TKey, TValue> .

Dictionary<string, string> map = ...; KeyValuePair<string, string> pair = ...; map.Add(pair); // Compilation Error ((IDictionary<string, string>)map).Add(pair); // Works

La implementación explícita funciona especificando con precisión qué método de interfaz implementa un método de instancia en el punto de definición. Por ejemplo

interface IFoo { void Method(); } class C1 : IFoo { // Implicitly implements IFoo.Method public void Method() { } } class C2 : IFoo { // Explicitly implements IFoo.Method void IFoo.Method() { } }