параметр динамического типа для метода, который возвращает void в c # - PullRequest
1 голос
/ 11 сентября 2011

Код ниже генерирует исключение:

Необработанное исключение: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: невозможно неявное преобразование типа 'void' в 'object'

var m = M((dynamic)d);  //Exception thrown here
private void M(Int32 n) { Console.WriteLine("M(Int32): " + n); }

Я думаю, что ноль должен быть назначен переменной m вместо исключения.

Есть идеи?

Редактировать

Обратите внимание, что ниже генерируется ошибка времени компиляции

dynamic result = M(1);//compile time error:  Cannot implicitly convert type 'void' to 'dynamic'

private void M(Int32 n) { } 

1 Ответ

2 голосов
/ 11 сентября 2011

Обычно на вопросы, подобные этому, даются ссылки на спецификацию, показывающие, что компилятор / среда выполнения на самом деле делают правильные вещи.В этом случае соответствующий раздел спецификации (7.2.2) относительно тихий.В основном это говорит о том, что точные детали зависят от реализации.

Тем не менее, я бы сказал, что это правильно: если вы думаете о динамической типизации как о грубой трансляции, позволяющей компилятору работать таким же образом, ноиспользуя фактические типы выражений такими, какими они являются во время выполнения, тогда вполне разумно иметь ошибку во время выполнения.Нормальным поведением компилятора при вызове метода void является запрет использования его в качестве правой части выражения присваивания, так почему же это должно измениться только потому, что привязка выполняется во время выполнения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...