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