[英]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.