Это из кривого наследия C скорее всего.
switch/case сродни goto но не совсем оно
поэтому можно делать всякие дикие вещи с циклами и if перекрывающими части switch.
И в итоге, что получается.
Такой код вполне себе валидный:
int x = 1;
switch (x) {
case 1:;
case 2:
int b = 2;
}
/// Даже с добавлением таких извращений
switch (x) {
case 1:
if (a == 1) {
case 2:
int b = 2;
}
}
А такой уже нет
int x = 1;
switch (x) {
case 2:
int b = 2;
case 1:;
}
И вроде как всё объяснимо. с одной стороны b видима везде после её объявления, но в case 1 мы можем придти минуя это объявление, как бы противоречие.
В C таких проблем нет, т.к. переменные должны объявляться в начале блока.
Решить можно 2.5 способами.
1. Обернуть действия в case фигурными скобками
1.5 Вынести их в отдельную функцию
2. Описать переменную до switch