С# обеспечивает следующие характеристики подписи, которые будут использоваться при перегрузке функций.
Мы знаем, что для перегрузки учитываются только аргументы; их количество и типы, но цель полиморфизма - предоставить одно и то же имя, но разное использование в зависимости от стратегии вызова.
Если у меня есть класс, содержащий два метода с одинаковым именем и сигнатурой, в то время как один является статическим, а другой нет, компилятор С# выдает ошибку; "Класс уже определяет член с именем" foo "с одинаковыми типами параметров". Вызов обоих методов будет различным; один с именем объекта и статический с именем класса. Следовательно, нет никакой двусмысленности со стратегией вызова. Тогда почему выдает ошибку?
class Example {
public void foo() { }
public static void foo() { }
}
class Program
{
static void Main(string[] args)
{
Example e = new Example();
e.foo();
}
}