为什么';C#字典是否实现了所有的IDictionary?

为什么';C#字典是否实现了所有的IDictionary?,c#,dictionary,idictionary,C#,Dictionary,Idictionary,我想创建一个类似于Dictionary的对象,并认为正确的方法是实现IDictionary接口,并使用composition包含底层Dictionary。我从下面开始(K=string,V=int) 但明确指出,Dictionary实现了IDictionary。所以我本以为这三种方法是可行的。要从文档中复制,词典的定义 方法void Add(KeyValuePair项)似乎不在字典中(因为它不编译),但它在IDictionary中,而且编译器确实正确地找到了它的实现问题3:发生了什么事 请注意,

我想创建一个类似于Dictionary的对象,并认为正确的方法是实现
IDictionary
接口,并使用composition包含底层Dictionary。我从下面开始(
K
=
string
V
=
int

但明确指出,
Dictionary
实现了
IDictionary
。所以我本以为这三种方法是可行的。要从文档中复制,
词典的定义

方法
void Add(KeyValuePair项)
似乎不在
字典中(因为它不编译),但它在
IDictionary中,而且编译器确实正确地找到了它的实现问题3:发生了什么事

请注意,Microsoft的
字典
文档没有指定这三种方法

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

IDictionary<string,int> _backingDictionary = new Dictionary<string,int>();
IDictionary\u backingDictionary=newdictionary();
而不是

Dictionary<string,int> _backingDictionary = new Dictionary<string,int>();
Dictionary\u backingDictionary=newdictionary();
因此这三种方法都可以很容易地工作。

字典
确实实现了这些方法,它只是显式地实现了这些方法。因此,您必须通过
IDictionary
接口访问它

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

这正是我的第一个猜测。您知道为什么MSDN文档中没有指定这一点吗?还有,他们为什么要隐藏这些方法?@the_-drow,我不确定他们为什么没有在文档中做出区分,也不确定他们为什么做出选择。我对后者的第一反应是,他们希望在默认情况下提供一个单一的Add重载。@the_drow:它实际上是在MSDN文档中指定的。您只需向下滚动到“显式接口实现”,这样显式/隐式答案就可以解决这个问题。JaredPar的回答,再加上仔细阅读微软关于显式/隐式实现和StackOverflow线程的文档,真的很有帮助。另外,感谢Daniel指出MSDN文档中确实列出了“显式实现”。
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
IDictionary<string,int> _backingDictionary = new Dictionary<string,int>();
Dictionary<string,int> _backingDictionary = new Dictionary<string,int>();
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() { }
}