Почему алгоритм разрешения перегрузки компилятора C # обрабатывает статические члены и члены экземпляра с одинаковой сигнатурой как равные?

Пусть у нас есть два члена, равные по сигнатуре, но один статичен, а другой нет:

class Foo
{
    public void Test() { Console.WriteLine("instance"); }

    public static void Test() { Console.WriteLine("static"); }
}

но такая генерация кода приводит к ошибке компилятора:

Тип «Foo» уже определяет член с именем «Test» с такими же типами параметров

Но почему?

Пусть мы скомпилировали это успешно, тогда:

  • Foo.Test () должен вывести «static»

  • new Foo (). Test (); должен вывести «instance»

Невозможно вызвать статический член вместо экземпляра один, потому что в этом случае произойдет другая, более разумная ошибка компилятора:

К члену «Foo.Test ()» нельзя получить доступ с помощью ссылки на экземпляр; вместо этого укажите имя типа

14
задан plinth 17 May 2011 в 15:46
поделиться