0

假设以下扩展方法:

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

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

现在我通过 IEnumerable<T> 接口的实现来调用它,比如说

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

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

4

2 回答 2

4

编译器选择与所讨论类型“最接近”的重载。因此,它将选择第二个重载。(当编译器无法弄清楚时,它会抱怨它是模棱两可的。)

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

更重要的是,这可以通过测试和阅读大量书籍、在线文章、文档、博客等来发现。稍微搜索一下应该比在此处发布更快。

于 2012-04-27T17:14:30.283 回答
3

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

阅读C# 语言规范中的重载解决方案。具体来说,您可以查看7.4.2.3,其中讨论了如何解决转换冲突。

于 2012-04-27T17:19:18.460 回答