2013-05-09 3 views
0

Я работаю в рамках с помощью метода следующей сигнатурыКак неоднозначность перегруженного метода

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

Я обнаружил, что мне нужно перегрузить это с дополнительным параметром BOOL

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); 

c ould invoke либо (при условии, что у меня голова прямо).

Я уверен, что я делаю что-то неправильно, но я не вижу, что!

Благодаря

Эдвард

+0

Мне нравится идея названных параметров ниже. Вы также можете переименовать метод? – Mzn

+1

.. или указать значение по умолчанию для причинValidation и удалить перегрузку без него ... – m0sa

ответ

0

Кратчайший бы поменять порядок параметров, так что вы дона 't должен дать bool в качестве последнего аргумента для обоих:

EDIT:

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

Необязательные параметры должны быть последними в определении. –

+0

Я знаю. Я ссылался на второй метод, у которого есть требуемый аргумент bool. Если это обменивается одной из обязательных строк, это создаст однозначный метод. –

+0

Это было непонятно, потому что вы заявили, что не должны давать bool в качестве последнего аргумента для обоих. Это будет с точки зрения вызывающего абонента. Определения по-прежнему нуждаются в bool в качестве последнего аргумента, потому что это необязательно. Показать код. –

2

Вы можете использовать named parameters. Поэтому, когда вы вызываете метод сделать что-то вроде:

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

Если два кандидата оцениваются одинаково хорошо, предпочтение отдается кандидату, который не имеет дополнительных параметров, для которых аргументы были опущены в вызове. Это является следствием общего предпочтений в отношении разрешения перегрузки для кандидатов, у которых меньше параметров .

Так что, если вы звоните как MyWhatsit.AddToolBarButton("cmdname", "text", "toolTip", "URL", "confirm", true);

это будет вызывать первый метод перегрузки, приведенные в вопросе

MSDN Link

+1

Звучит правильно, но кто вы цитируете? Вы можете добавить ссылку? –

+0

Ссылка добавлена, текст скопирован из раздела «Разрешение перегрузки» – Damith

+0

Это полезно. –

Смежные вопросы