Почему динамический вызов возвращает динамический результат?

public string Foo(object obj) {
    return null;
}

public string Foo(string str) {
    return null;
}

var x = Foo((dynamic) "abc");

Почему x динамический, компилятор недостаточно умен или я пропускаю что-то важное?

Ответ 1

Я просто угадываю здесь, но...

Когда вы добавляете листинг в dynamic, все выражение становится динамическим выражением. Результат динамического выражения всегда будет dynamic, потому что все разрешено во время выполнения.

Ознакомьтесь с страницей MSDN при использовании dynamic для получения дополнительной информации:

Использование динамического типа (Руководство по программированию на С#)

И прокрутите до следующего текста:

Результат большинства динамических операций сам по себе является динамическим.

Ответ 2

Эта публикация в блоге может быть вам полезна: http://blogs.msdn.com/b/cburrows/archive/2010/04/01/errata-dynamic-conversions-and-overload-resolution.aspx

В частности: "Если у вас есть вызов метода с динамическим аргументом, он отправляется динамически, период."

Это означает, что С# не знает, какая перегрузка вызывается до выполнения. Он не знает во время компиляции. Мое понимание заключается в том, что он даже не проверяет, какие возможные перегрузки находятся во время компиляции (почему?), Или обратите внимание на то, что в вашем случае все они возвращают строки.

Итак, во время компиляции возвращаемое значение Foo неизвестно. Таким образом, тип x определяется во время компиляции dynamic.