2010-10-22 3 views
10
public string Foo(object obj) { 
    return null; 
} 

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

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

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

+0

Что делать, если у вас была только одна функция 'Foo', которая возвращает' Hashtable'? Компилятор не знает заранее, что будет возвращаться как возвращаемое значение. В конце концов, вы могли бы сгенерировать реализацию для 'Foo' на лету (во время выполнения). –

+0

@Hamish Grubijan, когда вы вызываете функцию 'Foo', компилятор знает, какая функция вызывается во время компиляции. Попробуйте сделать эту функцию статической, нажмите F12, и она будет непосредственно перейти к правильной функции. –

+0

@ Darin, почему создание статического значения имеет значение? –

ответ

4

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

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

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

Using Type dynamic (C# Programming Guide)

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

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

+0

Да, но это компилируется просто отлично: 'string x = Foo ((dynamic)" abc ");' –

+0

Зачем это нужно разрешать во время выполнения, если все методы возвращают строку? – dotneter

+0

@Darin - Проверьте ссылку, которую я разместил. Он также охватывает неявные преобразования динамических обратных статических типов. Ищите: «И наоборот, неявное преобразование может быть динамически применено к любому выражению динамического типа». В этом случае результат выражения остается динамическим, но поскольку вы объявляете x как статический тип, он неявно преобразовывается обратно. –

3

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

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

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

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