扩展方法解析

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

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

实例方法优先于扩展方法。 你的观察certificate了同样的证据。

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

从C#中深入解释,

当编译器发现您正在尝试调用看起来像实例方法但无法找到的方法时,它会查找扩展方法(根据您的using指令可见) 。 在多个候选者作为目标扩展方法的情况下,具有类似于重载的“更好转换”的那个(例如,如果IChild和IBase都具有定义的类似扩展方法,则选择IChild.ExtensionMethod)

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

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