C# - 重载扩展方法

时间:2010-11-15 21:05:57

标签: c# visual-studio extension-methods ienumerable msdn

在一个非常基础的学习练习中,我使用的是LinkedList,当需要返回最后一个元素时,我错误地使用方法Last()而不是属性Last,然后我开始怀疑。

此方法是IEnumerable的扩展方法,因此如果它没有重载(Visual Studio + Resharper向我显示此方法的基本IEnumerable扩展方法签名),那将是非常低效的。

LinkedList MSDN page将大多数扩展方法指定为“已重载”。但我不确定它是什么意思(单击方法链接显示基本方法的解释)以及Visual Studio + Resharper为什么不向我显示。

感谢。

2 个答案:

答案 0 :(得分:7)

一个容易犯的错误就是将加载与过度骑行混淆。当MSDN页面说方法过载时,这意味着有多个版本的方法具有不同的参数。

您无法覆盖扩展方法,因为它们是静态的。

答案 1 :(得分:2)

您无法在技术上“覆盖”扩展方法,因为它们是静态的。但是,如果类或接口上的方法与扩展方法具有相同的签名,则编译器将优先使用类或接口方法而不是扩展方法。所以通常是以下几行:

list.LastOrDefault()

...实际上会被编译为:

Enumerable.LastOrDefault(list);

但是在下面的代码中:

public class LinkedList2<T> : LinkedList<T>{
    public T LastOrDefault() {
        return Last.Value;
    }
}
...
var list = new LinkedList2<int>();
list.LastOrDefault();

编译器实际上将调用LinkedList2.LastOrDefault()而不是Enumerable.LastOrDefault<T>(this IEnumerable<T>)

但是,由于LinkedList没有Last()LastOrDefault()方法,您最终会调用效率极低的Enumerable.Last()