2014-03-26 57 views
4

我有多個重載方法。但我不能說正確的。如何告訴編譯器,我特別需要將「這個方法」稱爲「使用這個參數」?無法調用具有正確參數映射的方法

頑皮的方法是第二個:

public string Translate(string text, params object[] args) 
{ 
    // Blah blah blah... 
} 

public string Translate(string text, string category, params object[] args) 
{ 
    // Here we do some blah blah blah again... 
} 

這裏的時候,我嘗試調用的第一個方法是這樣的:Translate("Hello {0} {1}", "Foo", "Bar");編譯器假定我打電話第二種方法,並設置參數作爲category = "Foo"args = "Bar"

我試圖在調用它們時命名這些參數,但它給了我一些編譯器錯誤。

Translate("Hello {0} {1}", args: "Foo", "Bar"); // CS1738 
Translate("Hello {0} {1}", args: "Foo", args: "Bar"); // CS1740 

我該如何做到這一點?

+0

「Foo」是一個字符串,並且與第二個參數'category'完全匹配。傳遞一個params數組,它應該沒問題。 – NoviceProgrammer

+1

是的,它很容易修復,但根本問題是簽名的選擇。這是刺將刺傷。這是一個超負荷的想法,一個不同的名字是更好的選擇。 –

+0

只是要注意:如果它是相關的,你必須調用一些重載版本的特定方法,也許你應該重新考慮你的重載方法。 –

回答

8

要長話短說:編譯器發現完全匹配,因此首選(在一個名爲category參數)上比較通用的一個(如利珀特這個說:「接近總是大於更遠更好」) 。有關更爲一般的討論,請參閱his answer here on SO關於帶有null值的重載分辨率。

您可以傳遞樣的陣列(而不是單個值):

Translate("Hello {0} {1}", new string[] { "Foo", "Bar" }); 

這將匹配第一過載,因爲string[]不是string(然後第二過載不適用)和編譯器自動翻譯一個數組到params參數(如果類型匹配)。

作爲替代你可以轉換第二個參數的東西,是不完全匹配(然後更通用版本將使用):

Translate("Hello {0} {1}", (object)"Foo", "Bar"); 

一般來說,我會避免這種重載正是爲了這個原因。使用不同名稱的函數會更好,因爲當參數類型爲object時,事情可能會變得不那麼明顯,並且這樣的錯誤可能很微妙,即使編譯器沒有抱怨,您也可能得到錯誤的結果。

+2

我不敢相信我怎麼沒有想到用'new string []'東西......感謝它的工作;) – Yves

相關問題