为何在FadeableGroup子类中调用扩展方法需加this关键字?
为什么在子类中调用父类的扩展方法必须显式使用this关键字?
你定义的扩展方法代码如下:
public static class MyUtility { public static void StartFadingIn(this FadeableGroup fadeableGroup, float duration) { // do something } }
在子类MyClass中调用时,只有加this才能被编译器识别:
namespace MyNamespace { public class MyClass : FadeableGroup { private void Test() { this.StartFadingIn(1); // 正常识别 // StartFadingIn(1); // 编译器无法识别 } } }
原因解析
- 扩展方法本质是静态方法的语法糖,编译器不会真的把它添加到目标类的实例方法集合里。
- 在类的非静态方法里直接写
StartFadingIn(1)时,编译器的查找逻辑是优先匹配当前类的静态方法、当前命名空间或已导入命名空间下的静态方法,不会默认把当前实例(this)作为调用者去匹配扩展方法。 - 只有显式加上
this.,编译器才会明确以当前实例为调用者,先检查该实例的类型(包括父类FadeableGroup)是否有对应的实例方法,当找不到匹配的实例方法时,才会去查找针对该类型定义的扩展方法,最终匹配到你写的StartFadingIn。
内容的提问来源于stack exchange,提问作者Tudvari
相关产品推荐
相关产品推荐

