5

可能重复:
泛型方法和方法重载

说我有一个像

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),尽管它们的身体乍一看几乎一模一样。

更有趣的是,在这两种情况下,编译器或运行时都不会检测到歧义并给出错误。
相反,运行时只是根据值是否为泛型来改变其行为,这对于调用者来说显然是出乎意料的。

为什么行为不一致?
或者,更好的是,为什么没有因为歧义而没有编译器(或运行时)错误?

4

2 回答 2

0

你为什么认为这是不一致的行为?重点是,您使用“可能是键”类型的 getter 来覆盖 index-getter ...

你认为,应该是预期的结果?一个警告?开发人员需要检查您想为哪些泛型使用什么类型......它足够智能,可以检查,方法“test1”将处理基于键的getter,而test2只处理基于索引的getter......

您必须禁止“int”作为类型(例如使用类约束)或在此处实现其他 getter 方法...

于 2012-08-26T06:21:58.153 回答
0

因为编译器不会针对它怀疑可能对您来说模棱两可的事物发出警告或错误。它会指出它认为模棱两可的东西。但是这里的编译器没有任何歧义。

假设我把正方形和长方形递给你,然后告诉你把正方形放在 a 堆里,把长方形放在 b 堆里。此外,您不必查看对象以查看它们是正方形还是矩形,因为它们已经被标记为正方形。现在... 在某个时候,我递给您一个标记为矩形的对象,但您注意到它也恰好是一个正方形。现在,我没有告诉你分析这些物体...我告诉你只是按照指示按照我标记它们的方式组织它们。这就是编译器的工作方式......完全按照您的指示去做。

于 2012-08-26T06:22:21.830 回答