在一个非常基础的学习练习中,我使用的是LinkedList,当需要返回最后一个元素时,我错误地使用方法Last()而不是属性Last,然后我开始怀疑。
此方法是IEnumerable的扩展方法,因此如果它没有重载(Visual Studio + Resharper向我显示此方法的基本IEnumerable扩展方法签名),那将是非常低效的。
LinkedList MSDN page将大多数扩展方法指定为“已重载”。但我不确定它是什么意思(单击方法链接显示基本方法的解释)以及Visual Studio + Resharper为什么不向我显示。
感谢。
答案 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()