为什么C#Dictionary没有实现所有的IDictionary?

时间:2011-08-26 21:15:37

标签: c# dictionary idictionary

我想创建一个类似于字典的对象,并认为正确的方法是实现IDictionary<K,V>接口,并使用组合来包含基础字典。我从下面开始(K = stringV = int

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

然后我使用Visual Studio的“实现接口”功能来删除我需要的所有封面方法。

IDictionary中似乎不存在Dictionary的三种方法:

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

然而the Microsoft documentation清楚地表明Dictionary实施IDictionary。所以我希望这三种方法可用。要从文档中复制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

我相信这三种缺失的方法可以在ICollection<>中找到。但Clear()所具有的Dictionary等其他方法也是如此。

问题1:如果没有实现这三个,C#如何逃脱?为什么会如此?我怀疑这是一个编译错误(我的推理,见下文)。 问题2:或者,我缺少什么?

这就是为什么我认为这可能是编译错误。检查以下代码:

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

方法void Add(KeyValuePair<string, int> item)似乎不在Dictionary<string,int>中(因为它没有编译),但它在IDictionary<string,int>中,并且编译器在某种程度上正确地找到它的实现。 问题3:发生了什么事?

请注意,Dictionary<K,V>的Microsoft文档未指定这三种方法。

最后,在我的实际实施中,我最终使用

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

而不是

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

这样所有三种方法都可以轻松实现。

1 个答案:

答案 0 :(得分:45)

Dictionary<TKey, TValue>确实实现了这些方法,它只是明确地实现了这些方法。因此,您必须通过IDictionary<TKey, TValue>界面访问它。

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

显式实现通过精确​​指定实例方法在定义点实现的接口方法来工作。例如

interface IFoo {
  void Method(); 
}

class C1 : IFoo {
  // Implicitly implements IFoo.Method
  public void Method() { }
}

class C2 : IFoo {
  // Explicitly implements IFoo.Method
  void IFoo.Method() { }
}