2011-02-16 51 views
1
static void F(string ham, object jam = null) { } 
static void F(string spam, string ham, object jam = null) { } 
... 
F("meat product", null); 

這個奇怪的代碼的開發人員顯然是試圖在兩端作出可選參數;目的是垃圾郵件和堵塞都是可選的,但總是需要火腿。兩端可選參數

編譯器選擇了哪個重載,爲什麼?

我從blog of Eric Lippert問題)被選擇的第二過載

+1

什麼是「對象」,什麼是「空」?它們不是標準C++的一部分。不知道什麼是構造函數對象,不可能完全回答這個問題。你確定這不是C#代碼或什麼?無論如何,如果`null`對於字符串構造函數的單個參數不是有效的,那麼它只能匹配第一個重載。 – 2011-02-16 09:21:42

+2

這是C#,這是博客條目http://blogs.msdn.com/b/ericlippert/archive/2011/02/10/optional-arguments-on-both-ends.aspx – Christian 2011-02-16 09:22:39

回答

0

。 (是你驚訝嗎?)

的原因很簡單。 過載決議算法有兩個 候選者,並且必須根據從參數到 形式參數類型的 轉換,選擇哪一個最好爲 。看第一個參數 。要麼將其轉換爲 爲字符串,要麼轉換爲...字符串。哼。我們 可以從這個 參數中得出結論,所以我們忽略它。

現在考慮第二個參數。我們 要麼將​​null轉換爲對象,如果我們 先挑過載或字符串, 如果我們選擇第二個過載。字符串 明顯比 對象更具體;每個字符串都是一個對象,但不是每個對象都是一個字符串。我們 力爭挑過載是 更具體的,所以我們選擇第二 過載,並調用

F("meat product", null, null); 

http://blogs.msdn.com/b/ericlippert/archive/2011/02/10/optional-arguments-on-both-ends.aspx