Build(d)
по-прежнему является динамическим выражением - тип метода времени компиляции dynamic
, хотя you может точно видеть, что происходит.Это означает, что методы расширения не будут работать.
По существу, компилятор следует достаточно простым правилам для определения типа выражения, и почти любое выражение, включающее dynamic
, в конечном итоге считаетсякак динамическое выражение.Исключениями являются:
d is SomeType
(всегда считается bool
) - Приведения, как прямые, так и с использованием
as
Это все, насколько я помню, хотя я мог ошибаться ...
Теперь язык мог бы быть спроектирован так, чтобы этот случай статически разрешалсявызов Build
как единственный разумный - в конце концов, d
не может иметь любого типа, который бы изменял, какой метод вызывается, - но указание точных правил для этого сделало быспецификация языка (и компилятор) значительно сложнее при сравнительно небольшом выигрыше.