Почему окружающий тип динамического выражения не статически разрешен в С#?

В динамическом выражении dynamic x есть ли причина/объяснение почему окружающее выражение (например, foo(x)) также становится динамическим?

Рассмотрим:

static string foo(object x) { }

static void Main()
{
  dynamic x = null;
  foo(x);  // foo(x) is a dynamic expression
}

Я предполагал, что компилятор может разрешить (во время компиляции), что foo(object) должен быть вызван. Однако, зависание с помощью мыши над foo(x) показывает, что тип является динамическим.

Я могу помочь компилятору с выводом, указав:

foo((object)x);

но я думал, что тип выражения dynamic равен object.

Ссылка на С# говорит, что "операции, содержащие выражения типа dynamic, не разрешены", мой вопрос:

Есть ли причины, которые мешают компилятору разрешить тип "внешнего" /окружающего выражения?

Ссылка

Тип динамический ведет себя как объект типа в большинстве случаев. Однако операции, содержащие выражения типа dynamic, не разрешаются или проверяются типом компилятором. Компилятор объединяет информацию об операции, и эта информация позже используется для оценки операции во время выполнения. В рамках процесса переменные типа dynamic скомпилируются в переменные типа объекта. Поэтому тип dynamic существует только во время компиляции, а не во время выполнения.

https://msdn.microsoft.com/en-us/library/dd264741.aspx

Ответ 1

Предположим, что у вас был

static string foo(object x) { return "bar"; }
static string foo(string x) { return "foo"; }

static void Main()
{
  dynamic x = null;
  foo(x);  // foo(x) is a dynamic expression
}

В этом случае компилятор не сможет решить тип выражения. Хотя я думаю, что в вашем примере тип должен быть разрешимым, он не будет в тех случаях, когда он наиболее полезен, что делает эту функцию довольно неэффективной для реализации.

Кроме того, DLR не может выполнять привязку нулевой ссылки, как в вашем примере.

Ответ 2

Причина этого в том, что динамические типы не работают с компилятором, но они разрешены в DLR. Компилятор не знает, в каком типе ваша динамика будет разрешена... Что-то, что работает с динамикой, разрешено только во время выполнения.

Дополнительная информация о DLR: https://msdn.microsoft.com/en-us/library/dd233052.aspx