Вдохновленный этим вопросом .
Краткая версия. Почему компилятор не может определить тип времени M(dynamic arg)
для компиляции, если существует только одна перегрузка M
или все перегрузки M
имеют одинаковый тип возвращаемого значения?
В спецификации, §7.6.5:
Вызывающее выражение динамически связано (§7.2.2), если выполняется хотя бы одно из следующих условий:
Первичное выражение имеет динамический тип времени компиляции.
Как минимум один аргумент необязательного аргумента-списка имеет динамический тип времени компиляции, а первичное выражение не имеет типа делегата.
Имеет смысл, что для
class Foo {
public int M(string s) { return 0; }
public string M(int s) { return String.Empty; }
}
компилятор не может определить тип времени компиляции
dynamic d = // dynamic
var x = new Foo().M(d);
потому что он не будет знать до тех пор, пока не будет запущена перегрузка M
.
Однако почему компилятор не может определить тип времени компиляции, если M
имеет только одну перегрузку или все перегрузки M
возвращают один и тот же тип?
Я хочу понять, почему спецификация не позволяет компилятору вводить эти выражения статически во время компиляции.