Что принимает решение о принятии второго продления в этом случае?
Когда у компилятора есть несколько допустимых методов на выбор, он использует набор правил разрешения перегрузки, чтобы определить, к какому методу он должен привязываться. Второй метод расширения соответствует вызывающей сигнатуре точно, поэтому он выбран. Так как любой другой тип напрямую конвертируемый в object
, будет выбрано первое расширение. Другие числовые типы неявно конвертируются в int
, но неявное преобразование не «лучше», чем прямое преобразование в родительский класс.
Я считаю, что отношение спецификация здесь 7.5.3.2:
7.5.3.2 Лучше член функции
Для целей определения лучшего члена функции, урезанный список аргументов A построена, содержащая только сами выражения аргументов в том порядке, в котором они появляются в списке исходных аргументов. списки параметров для каждого из членов кандидатов функции построены следующим образом:
...
Дано список аргументов А с набором аргументов выражений {E1, E2, ..., EN} и два применимых члена функции MP и MQ с типами параметров {P1, P2, ..., PN} и {Q1, Q2, ..., QN}, MP определены как лучший функциональный элемент, чем MQ, если
- для каждого аргумента, неявное преобразование из EX в QX не лучше, чем неявное преобразование из EX в PX, и
Поскольку «конверсии» от int
к int
«лучше», что переход от int
к object
, выбирается перегрузка int
.
Обратите внимание, что это относится к всем перегрузок, а не только методы расширения (хотя существует различные правила для разрыва связи между расширением и непродлением методы).
Что означает нижний уровень? Все расширения здесь находятся в одном пространстве имен. – usr
@usr Сверху вверх в иерархии классов. То есть сначала он будет искать методы расширения в типе 'System.Int32', и если ни один из них не будет сопоставлен, он затем продолжит поиск в' System.Object' –
Не думайте, что это вообще так. Не следует ли перегружать разрешение смотреть на все аргументы? MSDN часто ужасно расплывчато. Здесь никто не может сказать, что означает это предложение. – usr