Является ли пустой случай переключения в C# в сочетании со следующим непустым?
Со следующим кодом:
case "GETSITES":
case "SITESETUP":
MessageBox.Show("Help! I am suffering from the Air-Conditioned Nightmare!!!");
// ...
Будет ли MessageBox.Show
выполняется либо значение переключателя "GETSITES"
или же "SITESETUP"
?
Или только если значение переключателя "SITESETUP"
?
поскольку "GETSITES"
нет перерыва, я думаю, да, но я не уверен.
ОБНОВИТЬ
Я думаю, что я должен был сформулировать свой вопрос так:
Являются ли эти два фрагмента кода семантически эквивалентными?
фрагмент 1
case 0: case 1: // bla bla bla; break;
фрагмент 2(псевдокод)
case 0, 1: // bla bla bla; break;
3 ответа
То, что вы описываете, имеет две метки для одного и того же случая. C# действительно позволяет это. Однако вы не можете перейти к следующему оператору case таким же образом, как это позволяет C, то есть ваша метка не может иметь некоторый код, а затем перейти к следующему оператору case. Это запрещено и приведет к ошибке компиляции.
Объединяются ли пустые операторы case в C# со следующим непустым?
Я изначально сказал:
Вопрос предполагает ложь. Нет такой вещи, как пустой раздел переключателя в легальной программе на C#.
Это не совсем верно. Спецификация C# требует, чтобы раздел switch содержал хотя бы один оператор, но реализация на самом деле этого не делает.
Я исправляю свое заявление следующим образом:
Вопрос предполагает, что есть пустая секция переключателя (обратите внимание, что секции переключателя не являются операторами), но пустая секция переключателя может быть только в очень необычной ситуации. Прежде всего, давайте четко опишем анатомию оператора switch.
Когда у тебя есть:
switch(x)
{
case 1:
case 2:
Console.WriteLine("Hello");
break;
}
есть только одна секция переключателя. В случае 1 нет "пустой секции"; раздел состоит из всех предложений case, за которыми следуют ноль или более операторов. (Спецификация требует одного или нескольких операторов, но реализация фактически допускает нулевые операторы.) Список операторов должен иметь недостижимую конечную точку.
Единственный способ создать пустой список операторов, конечная точка которого недостижима внутри секции переключателя, - это недоступность самой секции переключателя. Это может произойти двумя способами. Либо весь коммутатор может быть недоступен, либо коммутатор может включаться постоянно. Короче говоря, единственный способ создать пустую секцию переключателей:
switch(1) { case 2: }
или же
if (false) switch(x) { case 2: }
Ни то, ни другое не является законным в соответствии со спецификацией, но компилятор C# допускает и то и другое. К счастью, это довольно безобидная ошибка.
В обоих случаях конечная точка секции недоступна, поэтому пустая секция достижима. Но никогда не бывает пустого раздела между делами.
На основании тестирования вы можете сделать следующее:
switch(i)
{
case 0:
case 1:
case 2:
doSomething();
break;
default:
doNothing();
break;
}
но ты не можешь:
switch(i)
{
case 0:
doSomething();
case 1:
doSomethingElse();
break;
default:
doNothing();
break;
}
Таким образом, ответ: ДА, вы можете сложить несколько случаев вместе, но вы не можете позволить управлению работать от одного случая к другому.