Почему динамический вызов возвращает динамический результат? - PullRequest
10 голосов
/ 22 октября 2010
public string Foo(object obj) {
    return null;
}

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

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

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

Ответы [ 2 ]

4 голосов
/ 22 октября 2010

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

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

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

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

И выделите следующий текст:

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

3 голосов
/ 22 октября 2010

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

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

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

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

...