C#:Dictionary <k,v>如何实现ICollection <keyvaluepair <k,v>&gt;没有添加(KeyValuePair <k,v>)?</k,v> </keyvaluepair <k,v> </k,v>

时间:2008-11-06 09:29:23

标签: c# .net dictionary interface

查看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'参数

为什么会这样?

3 个答案:

答案 0 :(得分: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)方法。

答案 1 :(得分:9)

实现了一些接口方法explicitly。如果使用反射器,您可以看到明确实现的方法,它们是:

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();

答案 2 :(得分:0)

它没有直接实现ICollection<KeyValuePair<K,V>>。它实现了IDictionary<K,V>

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