由于涉及IDictionary<object, object>
的奇怪原因,我刚刚进行了单元测试失败。
IDictionary<K,V>
有两种Remove
方法。一个需要K
,另一个需要KeyValuePair<K,V>
。考虑这两个词典:
IDictionary<string, object> d1 = new Dictionary<string, object>();
IDictionary<object, object> d2 = new Dictionary<object, object>();
d1.Add("1", 2);
d2.Add("1", 2);
Console.WriteLine(d1.Remove(new KeyValuePair<string, object>("1", 2)));
Console.WriteLine(d2.Remove(new KeyValuePair<object, object>("1", 2)));
输出为True
,然后是False
。由于KeyValuePair<object,object>
是d2.Remove(KeyValuePair<object,object>)
所期望的确切类型,为什么编译器会调用d2.Remove(object)
?
(验尸记录
在提示我提问的方案中,我没有直接使用IDictionary<object,object>
,而是使用通用参数:
public class DictionaryTests<DictT> where DictT :
IDictionary<object,object>, new()
因为问题是IDictionary
优先于ICollection
我决定通过在约束列表中加入ICollection
来“解决问题”:
public class DictionaryTests<DictT> where DictT :
ICollection<KeyValuePair<object, object>>, IDictionary<object,object>, new()
但这并没有改变编译器的想法......我想知道为什么不这样做。)
答案 0 :(得分:2)
提供问题的解决方案(请参阅评论):
Console.WriteLine(
((ICollection<KeyValuePair<object, object>) d2).
Remove(new KeyValuePair<object, object>("1", 2)));