Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么泛型的歧义是不一致的,而不是引起错误?_C#_.net_Generics_Ambiguity - Fatal编程技术网

C# 为什么泛型的歧义是不一致的,而不是引起错误?

C# 为什么泛型的歧义是不一致的,而不是引起错误?,c#,.net,generics,ambiguity,C#,.net,Generics,Ambiguity,可能重复: 比如说我有一门课 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 */ } } } 其中编译器将其解析为inti重载 现在,如果某个可怜的灵魂说Test1(0),那么如果他说Te

可能重复:

比如说我有一门课

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 */ } }
}
其中编译器将其解析为
inti
重载

现在,如果某个可怜的灵魂说
Test1(0)
,那么如果他说
Test2(0)
,他会得到一个不同的结果,即使乍一看身体看起来几乎完全相同

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

为什么行为不一致?

或者,更好的是,为什么没有编译器(或运行时)错误,因为模糊性?

为什么黑客认为这是不一致的行为? 关键是,您使用“maybe key”类型的getter覆盖索引getter

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


您必须禁止将“int”作为类型(例如使用类约束),或者在此处实现另一个getter方法…

,因为编译器不会发出警告或错误,这些警告或错误可能会让您觉得不明确。它指出了它发现的模棱两可的东西。但是这里的编译器没有什么不明确的地方


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

当然,但是运行时不能给出一个错误吗?这似乎比给出不一致的行为要好。许多人最终争论(用这么多的话)编译器以某种方式做某事的事实一定意味着它是正确的。我通常不同意这种逻辑。然而,这种情况是不同的,因为您说行为是不一致的,但同时您指出,当您说它根据值是否为泛型进行选择时,它是一致的。那么到底是谁在这里前后矛盾呸?泛型给出了与非泛型不同的行为,即使类型替换是相同的。我称之为不一致。请看我刚才在回答中添加的段落。@SergRogovtsev:哇,发现得好!没有看到那个;似乎完美地回答了这个问题。我们应该投票结束我的问题。
static string Test1<K>(K key) { return new SortedList<K>()[key]; }
static string Test2(int key) { return new SortedList<int>()[key]; }  // whoops