簡體   English   中英

C#擴展方法優先級

[英]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()可用,因此它調用了它。

在你的Mainfoo被聲明為IFoo 當編譯器查找方法Say ,它只找到擴展方法。 這是因為實例方法是在Foo聲明的,而不是在IFoo 編譯器不知道變量foo碰巧包含Foo的實例; 它只是查看變量聲明的類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM