2010-09-08 62 views
1

我添加的擴展方法是一個快捷方式的String.format:擴展方法VS靜態方法解析 - 我在spec中錯過了什麼?

public static string Format(this string format, params object[] args) 
{ 
    return String.Format(format, args); 
} 

當我調用該方法是這樣的:

"{0}".Format(1); 

一切就像一個魅力。 雖然

"{0}".Format("1"); 

不與此錯誤消息編譯:

錯誤CS0176:成員 '的String.Format(字符串,則params 對象[])' 不能與 實例引用來訪問;使用 類型名稱代替

我通過重命名方法(ooh這是一個痛苦)解決了此問題。但爲什麼會發生?我知道擴展與實例優先級 - 但這不是一個實例方法。如果一個路徑無法解析(在非靜態環境中引用靜態方法),那麼IMO應嘗試另一個路徑(完全合法的)。在規格中我錯過了什麼?

更新1增加了編譯錯誤信息。

+0

什麼是編譯錯誤信息? – thecoop 2010-09-08 10:38:56

+0

謝謝。我向根問題添加了錯誤消息。 – 2010-09-08 10:46:05

回答

3

7.5.3.1節(函數成員適用性)對成員是否是靜態的沒有提及。換句話說,靜態方法String.Format(String, params Object[] args)在您的第二次調用中仍然是適用,即使它實際上不會工作。

只有在找不到適用的功能成員時才搜索擴展方法。

換句話說,成員查找在類型和一組參數(以及可能的類型參數)上執行。作爲成員查找結果的驗證稍後完成,作爲第7.6.5.1節的最後一步。

+0

如果適用!=可編譯 - 那麼它是合乎邏輯的。我同意。如果這樣的捷徑工作,但會更好:)。 – 2010-09-08 10:47:25