В общем, я понимаю, что результат должен (когда это возможно) быть таким же, как результат, если бы вы скомпилировали тот же код с просто динамическими выражениями, замененными выражениями того типа, который динамический значение имеет во время выполнения. (Статически известные типы сохраняются в информации сайта вызова.)
В этом конкретном случае, имея только ваш код с .NET 4.0b1, результат будет:
Bar(int) says: 0
Однако, посмотрев на это снова (и проверив, какой бит на самом деле является динамическим), я немного растерялся. Я думаю, что это одна из тех ситуаций, когда я должен был бы очень внимательно изучить спецификацию, чтобы понять, каково правильное поведение. К сожалению, я не знаю, когда будет доступна спецификация C # 4.0.
Это сложный вопрос, и я подозреваю, что ключевая часть заключается в том, может ли связыватель во время выполнения определить, что значение имеет тип T
для того же T
, что и получатель, а не введите int
. Поскольку приемник в этом случае является динамическим, компилятор вообще не выполняет никакого разрешения перегрузки. Хм. Хитрый, определенно.