Почему динамический вызов возвращает динамический результат?
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
.