2009-07-15 62 views
7

我爲String寫了一個擴展方法來獲取char參數string.Remove(char)。但是當我使用這個時,它改爲默認的string.Remove(int)方法。擴展方法解析

不應該存在一個實際方法比隱式轉換具有更高的優先級嗎?

回答

9

實例方法優先於擴展方法。你的觀察結果證明是一樣的。

當解析調用哪個方法時,它總是會選擇一個匹配的實例方法通過擴展方法......這是直觀的方式。

從C#深入轉述,

當編譯器看到,你是 嘗試調用看起來 就像一個實例方法,但無法方法 找到一個,它然後查找 擴展方法(根據您的using指令可見 )。在 情況下多個候選作爲 目標擴展方法中,一個用 「更好的轉換」類似於 超載(例如,如果ICHILD和廣積 都具有限定的類似的延伸方法 .. IChild.ExtensionMethod是 選擇)

另外一個隱藏的代碼斷開器可以讓我們說TypeA沒有將SecretMethod作爲Libv1.0中的一個實例方法。所以你寫了一個擴展方法SecretMethod。如果作者在v2.0中引入了一個同名和簽名的實例方法(sans this param),並且您的重新編譯您的源代碼使用最新的n-most-Libv2.0,對擴展方法的所有現有調用會默默地被路由到新實例方法

+0

是的,但至少沒有直接的方法,只需要一個隱式投射。所以我預計它會尋找一個直接的方法。 – 2009-07-15 17:38:04

2

此行爲是正確的。原因是引入擴展方法不應改變現有代碼的執行方式。代碼在使用或不使用這種「多餘」擴展方法時應該表現完全相同。在某些情況下(比如你的),這可能看起來是違反直覺的,但是出於某種原因。