Нет, алгоритм вывода типов компилятора не пойдет в гору в поисках общего базового типа, и его нельзя применять только к параметрам универсального типа.Это не будет работать либо:
IFoo foo = condition ? b : c;
Почему?Ну, потому что не всегда ясно, каким должен быть базовый тип, и это может быть источником ошибок.Как компилятор знает, где остановиться?В конце концов, все может быть сведено к общему типу object
.
Кроме того, следует ли учитывать определенные пользователем преобразования?И следует ли рассматривать общие базовые типы после каждого возможного разговора?Это может продолжаться вечно.Просто гораздо лучше, если вы явно указали, какой тип вам нужен, и компилятор не угадал, что вы хотели.
Правило состоит в том, что алгоритм вывода типов будет использовать в качестве подходящих кандидатов только те типы, которые явно используютсяв выражении.Если среди этих кандидатов не найден действительный тип, тогда вывод просто не удастся.
В предыдущем примере решение, конечно, следующее:
IFoo foo = condition ? (IFoo)b : c;
И в вашем случае решениене полагаясь на алгоритм вывода, вам необходимо явно объявить требуемый параметр универсального типа.
После комментариев, способ, которым C # обрабатывает это, решает непреднамеренные критические изменения:
class A: IFoo
class B: IFoo, IBar
Потребитель пишетнекоторый код:
var foo = someCondition ? a : b //asume this is legal and resolves type to IFoo
Теперь кто-то думает, что пришло время обновить A
до A: IFoo, IBar
, и вдруг потребитель ломается.