我想创建一个类似字典的对象,并认为正确的方法是实现IDictionary<K,V>
接口,并使用组合来包含底层字典。我从下面开始(K
= string
,V
= 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);
然而微软文档清楚地表明,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)
似乎不在 in Dictionary<string,int>
(因为它不编译),但它在 in IDictionary<string,int>
,并且编译器确实以某种方式正确地找到了它的实现。 问题3:发生了什么?
请注意,Microsoft 文档Dictionary<K,V>
没有指定这三种方法。
最后,在我的实际实现中,我最终使用了
IDictionary<string,int> _backingDictionary = new Dictionary<string,int>();
代替
Dictionary<string,int> _backingDictionary = new Dictionary<string,int>();
这样所有三种方法都可以轻松工作。