Перегрузка метода 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";
}

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

Более подробное объяснение разрешения перегрузки.

Другие вопросы по тегам