2013-06-30 4 views
6

Сегодня я обнаружил что-то странное. Интересно, почему это работает:Перегрузка метода C# с параметрами и опциями

static void Main(string[] args) 
{ 
    Console.WriteLine(ExampleMethod(3)); 
    Console.ReadKey(); 
} 

public static string ExampleMethod(int required, params int[] optionalint) 
{ 
    return "ExampleMethod 2"; 
} 

public static string ExampleMethod(int required, string optionalstr = "default string", int optionalint = 10) 
{ 
    return "ExampleMethod 1"; 
} 

Подумайте об этом: Что такое результат при вызове ExampleMethod (3);

По моему мнению, это приводит к непредсказуемому результату. В моем случае всегда был вызван метод 1. Но по мере того как я изменил подпись метода 1, основной метод называется методом 2 (конечно).

Я не ожидал такого поведения, я ожидал «AmbiguousReferenceException» или, по крайней мере, предупреждение компилятора.

+0

Короткий ответ: потому что спецификация говорит так. http://www.microsoft.com/en-us/download/details.aspx?id=7029 –

ответ

5

Я бы ожидал такого поведения, потому что компилятор знает значения по умолчанию optionalstr и optionalint и поэтому может принять решение на основе того, какие значения использовать. Он не знал бы, что установить в качестве значения для int[] optionalint. Поскольку компилятор «более уверен» в том, что использовать, когда у вас есть дополнительные параметры, он вызывает этот метод.

Если вы добавили дополнительный метод, как этот

public static string ExampleMethod(int required) 
{ 
    return "ExampleMethod 3"; 
} 

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

More detailed explanation по разрешению перегрузки.

+0

Правила, по которым разрешение перегрузки довольно подробно. Этот ответ на аналогичный вопрос содержит дополнительную информацию: http://stackoverflow.com/questions/3190248/how-does-c-sharp-choose-with-ambigity-and-params –

+0

Спасибо, я добавил ссылку на ответ. – keyboardP

+0

aaah, хорошо, что имеет смысл. Спасибо. Я пока не думал, что в одной версии параметры были неявно установлены. – baschdy

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