Эта запись в блоге может быть вам полезна: http://blogs.msdn.com/b/cburrows/archive/2010/04/01/errata-dynamic-conversions-and-overload-resolution.aspx
В частности: «Если у вас есть вызов метода с динамическим аргументом, он отправляется динамически, точка.»
Это означает, что C # не знает, какая перегрузка вызывается до времени выполнения.Он не знает во время компиляции.Насколько я понимаю, он даже не проверяет , каковы возможные перегрузки во время компиляции (с чего бы это?), И не отмечает, что в вашем случае все они возвращают строки.
Итак, во время компиляции возвращаемое значение Foo
не известно.Таким образом, тип x
определяется во время компиляции как dynamic
.