11

看起来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)
};

失败了

方法'Add'没有重载需要'1'参数

为什么呢?

4

3 回答 3

18

预期的 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)方法。

于 2008-11-06T09:38:01.617 回答
9

一些接口方法是显式实现的。如果你使用反射器,你可以看到显式实现的方法,它们是:

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();
于 2008-11-06T09:41:28.677 回答
0

它不ICollection<KeyValuePair<K,V>>直接实现。它实现IDictionary<K,V>.

IDictionary<K,V>源自ICollection<KeyValuePair<K,V>>

于 2008-11-06T09:48:03.733 回答