c# - 为什么泛型的歧义不一致,而不是引发错误?

标签 c# .net generics ambiguity

<分区>

Possible Duplicate:
Generic methods and method overloading

假设我有一个类

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 键 重载。

现在,对比一下这句话

static string Test2(int key) { return new SortedList<int>()[key]; }  // whoops

编译器将其解析为 int i 重载。

现在,如果某个可怜的人说 Test1(0),他会得到与他说 Test2(0) 不同的结果,即使 body 看起来很漂亮乍一看非常相似。

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

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

最佳答案

为什么你认为这是不一致的行为? 这只是关键,您使用“可能键”类型的 getter 覆盖索引 getter ...

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

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

关于c# - 为什么泛型的歧义不一致,而不是引发错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12128014/

相关文章:

c# - 嵌入到另一个对象中的属性

c# - PL/SQL 异常和错误处理

c# - 如何动态地重新排序 gridview 中的列

Java XML-RPC 和原始类型

java - 无需强制转换即可将值添加到 HashMap

c# - 使用带有 Dependency 关键字和 UnityContainer 的属性进行初始化

c# - 如何在 C# 应用程序中打开 sapi 火车窗口?

c# - .NET 并发集合可以用于 x32 到 x64 的进程间通信吗?

c# - 在 ASP.NET MVC 项目中使用 Razor 生成电子邮件 HTML

c# - 如何在没有自己的构造函数的情况下在基类型的函数中调用泛型类型的构造函数?