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