c#重载决策规则

时间:2012-04-27 17:10:46

标签: c# generics overload-resolution

假设以下扩展方法:

public static string ToFooBarString(this object obj)
{
...
}

public static string ToFooBarString< T >(this IEnumerable< T > obj)
{
...
}

现在我通过IEnumerable&lt;的实现来调用它。 T>界面,说

Dictionary< int , string > f; // implements IEnumerable< KeyValuePair< int , string > >
f.ToFooBarString(); // <--- which one is called?

在这种情况下调用哪一个以及为什么?

2 个答案:

答案 0 :(得分:4)

编译器选择与所讨论类型“最接近”的重载。因此,它会选择第二个过载。 (当编译器无法弄明白时,它会抱怨它不明确。)

由于“object”位于层次结构的顶部,因此将首先使用任何其他适用的重载。

更重要的是,这可以通过测试和阅读大量书籍,在线文章,文档,博客等来发现。一些谷歌搜索应该发现它比发布在这里更快。

答案 1 :(得分:3)

将调用第二种方法。它基于类型的转换规则:

在C#语言规范中阅读Overload Resolution。具体来说,您可以查看7.4.2.3,其中讨论了如何解决转化冲突。

相关问题