C#扩展方法优先级

我对扩展方法的工作原理有点困惑。

如果我正确地阅读这个http://msdn.microsoft.com/en-us/library/bb383977.aspx并且这个如果扩展方法与密封类中的方法具有相同的签名,那么调用优先级是什么? 。

然后以下应该写出“实例”,而是写出“扩展方法”。

interface IFoo { } class Foo : IFoo { public void Say() { Console.WriteLine("Instance"); } } static class FooExts { public static void Say(this IFoo foo) { Console.WriteLine("Extension method"); } } class Program { static void Main(string[] args) { IFoo foo = new Foo(); foo.Say(); } } 

澄清澄清行为的任何帮助。

这里最大的区别是你已经为IFoo接口定义了一个扩展方法,你的foo变量是IFoo类型。

如果您的代码看起来像这样:

 Foo foo = new Foo(); foo.Say() 

将执行Foo.Say()方法,而不是扩展方法。

我希望我可以给你一个彻底的解释,为什么这是,但我只能涵盖基本机制。 由于您的变量是IFoo类型而不是Foo ,当编译器试图确定哪些方法可用时,它看起来超过了Foo类的任何非接口方法(应该如此)。 但是,扩展方法Say()可用,因此它调用了它。

在你的Mainfoo被声明为IFoo 。 当编译器查找方法Say ,它只找到扩展方法。 这是因为实例方法在Foo声明,而不是在IFoo 。 编译器不知道变量foo碰巧包含Foo的实例; 它只是查看变量声明的类型。