Перегрузка метода 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" или, по крайней мере, предупреждение компилятора.
1 ответ
Я ожидаю такого поведения, потому что компилятор знает значения по умолчанию optionalstr
а также optionalint
и поэтому может принять решение, основанное на том, какие ценности использовать. Он не знал бы, что установить в качестве значения для int[] optionalint
, Поскольку компилятор "более уверен" в том, что использовать, когда у вас есть необязательные параметры, он вызывает этот метод.
Если вы добавили дополнительный метод, как это
public static string ExampleMethod(int required)
{
return "ExampleMethod 3";
}
это будет вызванный метод, потому что компилятор сначала перейдет к методу, который не имеет необязательных параметров.
Более подробное объяснение разрешения перегрузки.