繁体   English   中英

C#-重载扩展方法

[英]C# - overloaded extension methods

在一个相当基础的学习练习中,我使用了LinkedList,并且当需要返回最后一个元素时,我错误地使用了Last()方法代替了Last属性,然后我开始怀疑。

此方法是IEnumerable的扩展方法,因此,如果未重载(Visual Studio + Resharper将向我显示该方法的基本IEnumerable扩展方法签名),则效率将非常低下。

LinkedList MSDN页面将大多数扩展方法指定为“重载”。 但是我不确定这是什么意思(单击方法链接会显示基本方法的说明),为什么Visual Studio + Resharper不会向我显示它。

谢谢。

with over . 一个容易犯的错误是在与混淆过 当MSDN页面上说方法已重载时,这意味着方法的多个版本具有不同的参数。

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

从技术上讲,您不能“替代”扩展方法,因为它们是静态的。 但是,如果类或接口上的方法与扩展方法具有相同的签名,则编译器将首选类或接口方法,而不是扩展方法。 所以通常以下行:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM