gpt4 book ai didi

c# - 为什么 C# Dictionary 不实现所有 IDictionary?

转载 作者:IT王子 更新时间:2023-10-29 04:18:40 24 4
gpt4 key购买 nike

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

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

然后我使用 Visual Studio 的“实现接口(interface)”功能来去除我需要的所有覆盖方法。

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

这样三种方法都可以轻松工作。

最佳答案

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)方法来工作。例如

interface IFoo {
void Method();
}

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

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

关于c# - 为什么 C# Dictionary 不实现所有 IDictionary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7210643/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com