C# 这个过载解决方案有什么意义?

C# 这个过载解决方案有什么意义?,c#,overloading,C#,Overloading,我刚刚因为一个奇怪的原因导致单元测试失败,原因涉及到IDictionary IDictionary有两个Remove方法。一个采用K,另一个采用KeyValuePair。考虑这两个字典,它们彼此非常相似,但并不完全相同: IDictionary<string, object> d1 = new Dictionary<string, object>(); IDictionary<object, object> d2 = new Dictionary<obj

我刚刚因为一个奇怪的原因导致单元测试失败,原因涉及到
IDictionary

IDictionary
有两个
Remove
方法。一个采用
K
,另一个采用
KeyValuePair
。考虑这两个字典,它们彼此非常相似,但并不完全相同:

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)));
由于问题在于
IDictionary
优先于
ICollection
我决定通过将
ICollection
包括在约束列表中来“平衡问题”:

public class DictionaryTests<DictT> where DictT :
    ICollection<KeyValuePair<object, object>>, IDictionary<object,object>, new()
公共类字典测试,其中DictT:
ICollection,IDictionary,new()

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

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

Console.WriteLine(

((ICollectionIIRC,这是因为在“声明类型”中找到了匹配项,但它没有继续到基类型。我以前问过类似的问题。正在查找链接。编辑:给你:(你的问题是重复的)Doh!这不是100%重复,因为我的问题是关于通用接口的,对吗?
*
等待着不可避免的结束*我认为任何类型都是一样的。wired,没有想到这一点。@Tigran:是的,这也让我感到惊讶(并不是很多事情!)这似乎是一个值得编译器警告的问题,但也许不是,因为它是由设计而成的。我想知道C#设计器是否打算用这个规则来解决某些问题。@Qwertie:Resharper可能会这样做:)这不可能是编译器警告,因为使其明确的显式代码可能会过多。最好不要在继承链中过载。@Qwertie:Resharper不会对此发出警告。
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)));