Это связано с тем, что почти любая операция , включающая динамическое значение, динамически решается во время выполнения. Исключений не существует для случаев, когда на момент компиляции присутствует только один метод; язык проще. (Для некоторых вызовов компилятор делает выполнение достаточного разрешения во время компиляции, чтобы гарантировать, что существует хотя бы один метод с подходящим количеством параметров - это указано в спецификации C # 5 в разделе 7.5. 4, но это не влияет на эффективный тип возврата.)
Из спецификации C # 5, раздел 7.6.5:
Вызов invocation-expression динамически связан, если выполняется хотя бы одно из следующих условий:
- Первичное выражение имеет тип времени компиляции
dynamic
.- По крайней мере, один аргумент необязательного аргумента-списка имеет тип времени компиляции
dynamic
, а первичное выражение не имеет типа делегата.В этом случае компилятор классифицирует invocation-expression как значение типа
blockquote>dynamic
. [...]Есть несколько операций с динамическими значениями, которые по-прежнему имеют нединамический общий тип. Например:
d is Foo
всегдаbool
d as Foo
всегдаFoo
new Foo(d)
всегдаFoo
], хотя точный конструктор для использования определяется во время выполненияНо любой вызов метода обрабатывается как возвращаемый тип
dynamic
.