我为String编写了一个扩展方法来获取一个char参数string.Remove(char)
。但是当我使用它时,它会调用默认的string.Remove(int)
方法。
实际方法的存在不应该比隐式转换具有更高的优先级吗?
答案 0 :(得分:9)
实例方法优先于扩展方法。你的观察也证明了这一点。
在解析要调用的方法时,它总是会在扩展方法上选择匹配的实例方法......这在某种程度上是直观的。
从C#中深入解释,
当编译器看到你的时候 试图调用一个看起来像的方法 像实例方法,但无法 找到一个,然后寻找 扩展方法(可见 基于您的
using
指令)。在 多个候选人的案例 目标扩展方法,一个用 “更好的转换”类似于 重载(例如IChild和IBase 两者都有类似的扩展方法 定义.. IChild.ExtensionMethod是 选择)
另外一个隐藏的代码破坏者可以说TypeA没有将SecretMethod作为Libv1.0中的实例方法。所以你写了一个扩展方法SecretMethod。如果作者在v2.0中引入了相同名称和签名的实例方法(没有this
param),那么重新编译你的源代码使用最新的n-libv2.0 ,对扩展方法的所有现有调用现在将静默地路由到新实例方法。
答案 1 :(得分:2)
这种行为是正确的。原因是引入扩展方法不应该改变现有代码的执行方式。无论有没有这种“多余”的扩展方法,代码的行为都应该完全相同。在某些情况下(如同你的情况),它可能看似违反直觉,但有理由发生。