Mar*_*ton 26 c# dictionary idictionary
我想创建一个类似于字典的对象,并认为正确的方法是实现IDictionary<K,V>接口,并使用组合来包含底层字典.我从下面开始(K= string,V= int)
public class DictionaryLikeObject : IDictionary<string,int> {
Dictionary<string,int> _backingDictionary = new Dictionary<string,int>();
}
Run Code Online (Sandbox Code Playgroud)
然后我使用Visual Studio的"实现接口"功能来删除我需要的所有封面方法.
IDictionary似乎不存在三种方法Dictionary:
void Add(KeyValuePair<string, int> item);
void CopyTo(KeyValuePair<string, int>[] array, int arrayIndex);
bool Remove(KeyValuePair<string, int> item);
Run Code Online (Sandbox Code Playgroud)
然而,Microsoft文档清楚地表明了这些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
Run Code Online (Sandbox Code Playgroud)
我相信这三种缺失的方法都可以在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
Run Code Online (Sandbox Code Playgroud)
该方法void Add(KeyValuePair<string, int> item)似乎不在Dictionary<string,int>(因为它不编译),但它在IDictionary<string,int>,并且不知何故编译器正确地找到它的实现. 问题3:发生了什么事?
请注意,Microsoft文档Dictionary<K,V>不指定这三种方法.
最后,在我的实际实现中,我最终使用了
IDictionary<string,int> _backingDictionary = new Dictionary<string,int>();
Run Code Online (Sandbox Code Playgroud)
代替
Dictionary<string,int> _backingDictionary = new Dictionary<string,int>();
Run Code Online (Sandbox Code Playgroud)
这样所有三种方法都可以轻松实现.
Jar*_*Par 45
在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
Run Code Online (Sandbox Code Playgroud)
显式实现通过精确指定实例方法在定义点实现的接口方法来工作.例如
interface IFoo {
void Method();
}
class C1 : IFoo {
// Implicitly implements IFoo.Method
public void Method() { }
}
class C2 : IFoo {
// Explicitly implements IFoo.Method
void IFoo.Method() { }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5928 次 |
| 最近记录: |