Почему в операторе switch требуется break после возврата yield?
Вопрос предполагает неверную предпосылку. Оператор останова не требуется после возврата доходности в операторе переключения. Например:
switch(x)
{
case 123:
yield return 456;
M();
throw new Exception();
case 789: // and so on
Здесь мы имеем возврат доходности в операторе switch, за которым не следует перерыв. Затем следует вызов M (), а затем оператор throw. Это совершенно законно.
Настоящее правило заключается в том, что конечная точка секции переключателя не должна быть достижимой .
Конечные точки break, continue, return, goto, return и throw недоступны, поскольку все эти операторы ветвятся в другое место и не возвращаются, так что токен кода, следующий непосредственно за ними, недоступен. Это, в отличие от, скажем, вызова метода, который ветвится в другое место и затем возвращается, или возврата дохода, который передает управление обратно вызывающей стороне; когда вызывающая сторона передает управление обратно в блок итератора, управление выбирает то место, где остановился возврат доходности, поэтому конечная точка возврата доходности достижима.
Если вас интересует эта тема, я рекомендую прочесть раздел 8.1 спецификации.