Сегодня я наткнулся на это, и я удивлен, что раньше этого не заметил. Учитывая простую программу на С#, похожую на следующую:
public class Program
{
public static void Main(string[] args)
{
Method(); // Called the method with no arguments.
Method("a string"); // Called the method with a string.
Console.ReadLine();
}
public static void Method()
{
Console.WriteLine("Called the method with no arguments.");
}
public static void Method(string aString = "a string")
{
Console.WriteLine("Called the method with a string.");
}
}
Вы получаете вывод, указанный в комментариях для каждого вызова метода.
Я понимаю, почему компилятор выбирает перегрузки, которые он делает, но почему это разрешено в первую очередь? Я не спрашиваю, каковы правила разрешения перегрузки, я это понимаю, но я спрашиваю, есть ли техническая причина, почему компилятор разрешает то, что по существу две перегрузки с одной и той же сигнатурой?
Насколько я могу судить, функция перегрузки с сигнатурой, которая отличается от другой перегрузки только наличием дополнительного необязательного аргумента, предлагает не что иное, как если бы аргумент (и все предыдущие аргументы) просто требовался.
Одна вещь, которую он делает, позволяет программисту (который, вероятно, не уделяет достаточного внимания) думать, что они вызывают разную перегрузку той, которая есть на самом деле.
Я предполагаю, что это довольно необычный случай, и ответ на вопрос, почему это разрешено, может быть просто потому, что просто не стоит сложности, чтобы запретить его, но есть ли еще одна причина, по которой С# позволяет перегрузкам функций отличаться от других только посредством один дополнительный необязательный аргумент?