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()
可用,因此它调用了它。
在你的Main
, foo
被声明为IFoo
。 当编译器查找方法Say
,它只找到扩展方法。 这是因为实例方法在Foo
声明,而不是在IFoo
。 编译器不知道变量foo
碰巧包含Foo
的实例; 它只是查看变量声明的类型。