假设以下扩展方法:
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?
在这种情况下调用哪一个以及为什么?
答案 0 :(得分:4)
编译器选择与所讨论类型“最接近”的重载。因此,它会选择第二个过载。 (当编译器无法弄明白时,它会抱怨它不明确。)
由于“object”位于层次结构的顶部,因此将首先使用任何其他适用的重载。
更重要的是,这可以通过测试和阅读大量书籍,在线文章,文档,博客等来发现。一些谷歌搜索应该发现它比发布在这里更快。
答案 1 :(得分:3)
将调用第二种方法。它基于类型的转换规则:
在C#语言规范中阅读Overload Resolution。具体来说,您可以查看7.4.2.3,其中讨论了如何解决转化冲突。