Перегрузка метода может быть формой полиморфизма в динамическом языке или в языке, который использует множественную диспетчеризацию для разрешения перегрузки метода, но это не в C #. В перегрузке методов C # полиморфизма нет, поскольку перегрузка для каждого вызова выбирается строго во время компиляции (за исключением случая dynamic
переменных).
UPDATE
@ Ли заявляет, что «не требуется, чтобы полиморфизм был механизмом времени выполнения».
Да, есть.
В C # перегрузка методов - удобный способ сообщить о намерениях и избежать нежелательных имен методов, присваивая нескольким методам одно и то же имя. Но предположим на секунду, что в C # не было перегрузки методов. Предположим, что сигнатура метода полностью состоит из его имени, игнорируя типы параметров. Что будет потеряно в этом гипотетическом языке?
Ну, на этом языке мы должны дать каждому методу свое имя. Мы должны были бы создать WriteLineString, WriteLineInt32, WriteLineUInt32 и т. Д. Это было бы довольно ужасно с точки зрения удобства использования.
Но что изменится в выразительной силе языка? Ничего такого. Мы все еще могли бы написать тот же код с несколькими изменениями имен методов. Компилятор будет разрешать одни и те же вызовы в те же места. ИЛ был бы точно таким же. Там не будет никакой разницы в эффективности, мощности или сложности.
Так что, если выразительная мощь языка и скомпилированного кода будет одинаковой в C # и в no-overloads-C #, то как перегрузки можно считать «полиморфизмом»? Полиморфизм означает проявление различного поведения в зависимости от типа объекта. Если устранение перегрузки не приводит к изменению поведения объекта, то как перегрузка может быть связана с полиморфизмом?
Время выполнения против время компиляции поведение лежит в основе полиморфизма, и оно не имеет никакого отношения к перегрузке метода.