Следует правилам раздела 7.5.3.2 спецификации C # 4 («Лучший функциональный член»).
Во-первых (хорошо, увидев, что оба метода применимы ), нам нужно проверить преобразования типов аргументов в типы параметров. В этом случае это достаточно просто, потому что есть только один аргумент. Ни одно преобразование типа аргумента в тип параметра не является «лучшим», поскольку оба преобразуются из ConcreteA
в IfaceA
. Поэтому он переходит к следующему набору критериев, включая этот:
В противном случае, если MP имеет более конкретную
Типы параметров, чем MQ, то MP
лучше чем MQ. Пусть {R1, R2,…, RN}
и {S1, S2,…, SN} представляют собой
необоснованный и нерасширенный
Типы параметров MP и MQ. член парламента
типы параметров являются более конкретными, чем
MQ, если для каждого параметра RX не
менее специфичен, чем SX, а для
хотя бы один параметр, RX больше
специфичнее, чем SX: специфично, чем SX:
- Параметр типа менее специфичен, чем параметр без типа.
- ...
Таким образом, даже если преобразование одинаково хорошо, перегрузка с использованием IfaceA
напрямую (а не через делегатов) считается "лучшей", поскольку параметр типа IfaceA
более специфичен, чем параметр типа T
.
Нет способа заставить компилятор предупреждать об этом поведении - это просто нормальное разрешение перегрузки.