Почему алгоритм перегрузки с использованием компилятора С# обрабатывает статические и экземпляры с равной подписью как равные?
Пусть у нас есть два члена, равные по сигнатуре, но один статический, а другой - не:
class Foo
{
public void Test() { Console.WriteLine("instance"); }
public static void Test() { Console.WriteLine("static"); }
}
но такой код генерирует ошибку компилятора:
Тип 'Foo' уже определяет член, называемый 'Test' с теми же параметрами
Но почему?
Давайте скомпилируем это успешно, затем:
Невозможно вызвать статический член вместо экземпляра one, потому что в этом случае произойдет другая, более разумная ошибка компилятора:
Пользователь 'Foo.Test()' не может получить доступ с ссылкой на экземпляр; квалифицируйте его вместо имени типа
Ответы
Ответ 1
Как насчет метода экземпляра:
Test();
Что бы это вызвало? Вероятно, вы захотите предоставить метод экземпляра "priority" поверх статического метода, но оба будут применимы.
Я бы сказал, что даже если бы это было разрешено, было бы принципиально плохой идеей сделать это с точки зрения удобочитаемости... например, если вы изменили метод, который вызвал Test
, от статического до примера, это изменило бы смысл тонким способом.
Другими словами, у меня нет проблем с тем, что это запрещено:)