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

Qwe*_*tie 8 c# overloading

我刚刚因为一个奇怪的原因而进行了单元测试失败IDictionary<object, object>.

IDictionary<K,V>有两种Remove方法.一个拿a K,另一个拿a 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)));
Run Code Online (Sandbox Code Playgroud)

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()
Run Code Online (Sandbox Code Playgroud)

因为问题是IDictionary优先于ICollection我,我决定通过包含ICollection在约束列表中来"解决问题" :

public class DictionaryTests<DictT> where DictT :
    ICollection<KeyValuePair<object, object>>, IDictionary<object,object>, new()
Run Code Online (Sandbox Code Playgroud)

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

lep*_*pie 2

提供问题的解决方案(另见评论):

Console.WriteLine( 
   ((ICollection<KeyValuePair<object, object>) d2).
      Remove(new KeyValuePair<object, object>("1", 2)));
Run Code Online (Sandbox Code Playgroud)