[英]C# Extension method precedence
我对扩展方法的工作原理有点困惑。
如果我正确地阅读这个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
的实例; 它只是查看变量声明的类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.