Почему динамический вызов возвращает динамический результат?
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 для получения дополнительной информации:
В частности:
"Если у вас есть вызов метода с динамическим аргументом, он отправляется динамически, период."
Это означает, что С# не знает, какая перегрузка вызывается до выполнения. Он не знает во время компиляции. Мое понимание заключается в том, что он даже не проверяет, какие возможные перегрузки находятся во время компиляции (почему?), Или обратите внимание на то, что в вашем случае все они возвращают строки.
Итак, во время компиляции возвращаемое значение Foo неизвестно. Таким образом, тип x определяется во время компиляции dynamic.