以下是显示奇怪性的示例代码:(基于注释修复的代码)
public class C{}
public static class E {
public static void Foo(this C o) { }
}
class D:C {
void test() {
// Foo(); // will not compile
this.Foo(); // compile ok
}
}
自然在真实场景中,C类将是一个我无法访问其源代码的类
任何人都知道为什么这个奇怪的要求使用this关键字?
答案 0 :(得分:8)
查看C#规范,第7.6.5.2节指定扩展方法调用仅适用于以下格式的方法调用:
expr . identifier ( ) expr . identifier ( args ) expr . identifier < typeargs > ( ) expr . identifier < typeargs > ( args )
当它是独立方法调用时,没有expr
,因此它不会查找扩展方法。这是因为没有expr
,它不知道扩展方法的第一个参数应该是什么。
答案 1 :(得分:2)
这不是因为D是C的子类。(在你的例子中,btw,它不是。)这是因为扩展方法是“语法糖”,使得它看起来方法属于一个类,甚至当它没有。此编译器功能将编译器将callingObject.Foo();
的任何调用转换为Foo(callingObject);
。
在注释掉的代码中,编译器不知道要使用什么作为扩展方法的第一个参数(即它不知道你想要什么this C o
)因为没有类型的对象{ {1}}或C
的子类正在调用它。
如果要从基类调用扩展方法,则会看到相同的行为。
希望这有助于消除一些困惑。
答案 2 :(得分:2)
如果您有权更改类的代码...为什么要使用扩展方法?扩展方法对于您无法更改的类非常有用。我想成像这将是一个令人不悦的编程实践。