可能重复:
泛型方法和方法重载
说我有一个像
class SortedList<K>
{
public string this[int i] { get { return "a"; /* dummy sample code */ } }
public string this[K key] { get { return "b"; /* dummy sample code */ } }
}
现在让我们说一些家伙决定使用它:
static string Test1<K>(K key) { return new SortedList<K>()[key]; }
编译器将此调用解析为K key
重载。
现在,将此与说
static string Test2(int key) { return new SortedList<int>()[key]; } // whoops
编译器将其解析为int i
重载。
现在,如果某个可怜的灵魂说出来Test1(0)
,他会得到与他说出来的结果不同的结果Test2(0)
,尽管它们的身体乍一看几乎一模一样。
更有趣的是,在这两种情况下,编译器或运行时都不会检测到歧义并给出错误。
相反,运行时只是根据值是否为泛型来改变其行为,这对于调用者来说显然是出乎意料的。
为什么行为不一致?
或者,更好的是,为什么没有因为歧义而没有编译器(或运行时)错误?