2013-05-09 55 views
0

我在一個框架,有以下方法簽名工作如何消除歧義的重載方法

public ImageLinkButton AddToolBarButton(string commandName, string text, string toolTip, string imageUrl, string confirmMessage, bool defineID = false) 

我發現我需要一個額外的布爾參數重載這個

public ImageLinkButton AddToolBarButton(string commandName, string text, string toolTip, string imageUrl, string confirmMessage, bool causesValidation, bool defineID = false) 

然而,在使用中我看不出如何確保實際調用哪種方法,因爲調用

MyWhatsit.AddToolBarButton("cmdname", "text", "toolTip", "URL", "confirm", true); 

可能調用要麼(假設我的頭腦直着)。

我很確定我做錯了什麼,但我什麼都看不到!

感謝

愛德華

+0

我喜歡下面的命名參數的想法。你也可以重命名方法? – Mzn 2013-05-09 10:51:28

+1

..或者爲CausesValidation指定一個默認值,並在沒有它的情況下刪除超載... – m0sa 2013-05-09 10:52:27

回答

0

最快的將是交換參數的順序,使你不作爲兩者的最後一個論點,我們不必提供bool:

編輯:

public ImageLinkButton AddToolBarButton(string commandName, 
             string text, 
             string toolTip, 
             string imageUrl, 
             string confirmMessage, 
             bool defineID = false) 

public ImageLinkButton AddToolBarButton(string commandName, 
             string text, 
             string toolTip, 
             string imageUrl, 
             bool causesValidation,//swap this 
             string confirmMessage, //and this 
             bool defineID = false) 
+1

可選參數需要是定義中的最後一個。 – 2013-05-09 10:51:03

+0

我知道。我指的是具有所需布爾參數的第二種方法。如果它與所需字符串中的一個交換,它將創建一個明確的方法。 – 2013-05-09 10:53:25

+0

這是令人困惑的,因爲你聲明不必將布爾作爲兩者的最後一個論點。這將從調用者的角度來看。這些定義仍然需要bool作爲最後一個參數,因爲它是可選的。顯示一些代碼。 – 2013-05-09 10:54:33

2

您可以使用named parameters。所以,當你調用一個方法做這樣的事情:

MyWhatsit.AddToolBarButton(commandName: "cmdname", text: "text", ... 
1

如果兩個候選人被判斷爲一樣好,偏好去不有一個針對 論點在調用省略可選參數的候選人。這是 參數較少的候選重載分辨率的首選 的結果。

所以,如果你喜歡MyWhatsit.AddToolBarButton("cmdname", "text", "toolTip", "URL", "confirm", true);

這將調用問題給出的第一個重載方法

MSDN Link

+1

聽起來很對,但是你在引用誰?你能添加一個鏈接嗎? – 2013-05-09 10:51:06

+0

添加鏈接,從超載分辨率部分複製的文本 – Damith 2013-05-09 10:56:41

+0

這很有幫助。 – 2013-05-09 11:05:19