C# 3.0擴展重載抉擇
C# 3.0語言有很多值得學習的地方,這里我們主要介紹C# 3.0擴展重載抉擇,包括介紹調用實例方法Func等方面。
C# 3.0擴展重載抉擇
看了上面的介紹我們不難發現一個問題:如果一個類型中的某個實例方法與擴展方法的簽名等價(這里說“等價”是因為擴展方法與調用形式一樣的實例方法相比,要多一個表示被擴展類型的參數,也就是***個有this修飾符的參數),那么當在被擴展類型的對象上調用方法時,就會產生沖突。我們將這種沖突稱為重載抉擇問題。C# 3.0擴展重載抉擇,將對擴展方法的調用也納入到重載抉擇的范疇之內,并且規定擴展方法擁有***的優先級。也就是說,對于一組特性類型、特定順序的參數列表,只有當被擴展類型中沒有得以匹配的方法時,才考慮從擴展方法中選擇一個最合適的方法進行調用。
現在,我們為上面的SampleExtensions類再添加一個用于擴展SampleClass類型的擴展方法Func:
- public static void Func(this SampleClass s)
- {
- s.Val = -1;
- Console.WriteLine("Am I appearing?");
- }
如果用調用實例方法的語法調用這個擴展方法,則其調用形式與調用無參的實例方法Func完全一致。再次編譯并運行原來的程序,輸出的結果并沒有改變,也就是說這個擴展方法根本沒有被調用,實際被調用的方法是實例方法Func。當然,如果將這個擴展方法作為普通的靜態方法進行調用是沒有問題的。
另外如果兩個靜態類中為同一個類型定義了簽名一致的靜態方法,則***定義的靜態方法具有較高的優先級;而同一程序集中定義的靜態方法優先級高于用using語句從其他命名空間中導入的擴展方法;***,如果兩個命名空間中包含簽名一致的擴展方法,則***引入的命名空間中的擴展方法優先級較高。以上介紹C# 3.0擴展重載抉擇
【編輯推薦】