我刚刚因为一个奇怪的原因而进行了单元测试失败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)
但这并没有改变编译器的思想......我想知道为什么不这样做.)
提供问题的解决方案(另见评论):
Console.WriteLine(
((ICollection<KeyValuePair<object, object>) d2).
Remove(new KeyValuePair<object, object>("1", 2)));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |