这种重载分辨率如何有意义?

时间:2013-04-11 07:17:49

标签: c# overloading

由于涉及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()

但这并没有改变编译器的想法......我想知道为什么不这样做。)

1 个答案:

答案 0 :(得分:2)

提供问题的解决方案(请参阅评论):

Console.WriteLine( 
   ((ICollection<KeyValuePair<object, object>) d2).
      Remove(new KeyValuePair<object, object>("1", 2)));