[英]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.