为什么超类的扩展方法需要这个?

时间:2010-07-21 16:51:54

标签: c#

以下是显示奇怪性的示例代码:(基于注释修复的代码)

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关键字?

3 个答案:

答案 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)

如果您有权更改类的代码...为什么要使用扩展方法?扩展方法对于您无法更改的类非常有用。我想成像这将是一个令人不悦的编程实践。