Необязательные аргументы на обоих концах - PullRequest
1 голос
/ 16 февраля 2011
static void F(string ham, object jam = null) { }  
static void F(string spam, string ham, object jam = null) { }  
...  
F("meat product", null);

Разработчик этого странного кода, очевидно, пытается сделать необязательные параметры на обоих концах;предполагается, что и спам, и джем являются необязательными, но ветчина обязательна.

Какую перегрузку выбирает компилятор и почему?

( Я получил вопрос от блог Эрика Липперта )

1 Ответ

0 голосов
/ 16 февраля 2011

Выбрана вторая перегрузка.(Вы были удивлены?)

Причина проста.Алгоритм разрешения перегрузки имеет два кандидата и должен выбирать, какой из них является наилучшим на основе преобразования аргументов в формальные типы параметров.Посмотрите на первый аргумент.Либо он преобразуется в строку, либо в ... строку.Хммм.Мы не можем ничего сделать из этого аргумента, поэтому проигнорируем его.

Теперь рассмотрим второй аргумент.Мы либо конвертируем null в объект, если выберем первую перегрузку, либо в строку, если выберем вторую перегрузку.Строка явно более конкретна, чем объект;каждая строка является объектом, но не каждый объект является строкой.Мы стремимся выбрать более конкретную перегрузку, поэтому выбираем вторую перегрузку и вызываем

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

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

...