繁体   English   中英

这种重载决议有何意义?

[英]How does this overload resolution make any sense?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM