扩展方法解析

时间:2009-07-15 17:20:01

标签: c# .net extension-methods

我为String编写了一个扩展方法来获取一个char参数string.Remove(char)。但是当我使用它时,它会调用默认的string.Remove(int)方法。

实际方法的存在不应该比隐式转换具有更高的优先级吗?

2 个答案:

答案 0 :(得分:9)

实例方法优先于扩展方法。你的观察也证明了这一点。

在解析要调用的方法时,它总是会在扩展方法上选择匹配的实例方法......这在某种程度上是直观的。

从C#中深入解释,

  

当编译器看到你的时候   试图调用一个看起来像的方法   像实例方法,但无法   找到一个,然后寻找   扩展方法(可见   基于您的using指令)。在   多个候选人的案例   目标扩展方法,一个用   “更好的转换”类似于   重载(例如IChild和IBase   两者都有类似的扩展方法   定义.. IChild.ExtensionMethod是   选择)

另外一个隐藏的代码破坏者可以说TypeA没有将SecretMethod作为Libv1.0中的实例方法。所以你写了一个扩展方法SecretMethod。如果作者在v2.0中引入了相同名称和签名的实例方法(没有this param),那么重新编译你的源代码使用最新的n-libv2.0 ,对扩展方法的所有现有调用现在将静默地路由到新实例方法

答案 1 :(得分:2)

这种行为是正确的。原因是引入扩展方法不应该改变现有代码的执行方式。无论有没有这种“多余”的扩展方法,代码的行为都应该完全相同。在某些情况下(如同你的情况),它可能看似违反直觉,但有理由发生。