Está vazio caso de mudar em c # combinado com o próximo não vazio?

Com o seguinte código:

case "GETSITES": case "SITESETUP": MessageBox.Show("Help! I am suffering from the Air-Conditioned Nightmare!!!"); // ... 

O MessageBox.Show será executado ou o valor do switch é "GETSITES" ou "SITESETUP" ?

Ou somente se o valor do switch for "SITESETUP" ?

Como "GETSITES" não tem intervalo, estou pensando sim, mas não tenho certeza.


ATUALIZAR

Eu acho que a maneira que eu deveria ter formulado a minha pergunta como:

Esses dois fragments de código são semanticamente equivalentes?

  • fragment 1

     case 0: case 1: // bla bla bla; break; 
  • fragment 2 (pseudo código)

     case 0, 1: // bla bla bla; break; 

O que você está descrevendo é ter dois labels para o mesmo caso. C # permite isso. Você não pode, no entanto, passar para a próxima instrução de caso da mesma forma que C permite, isto é, sua etiqueta não pode ter algum código e, em seguida, passar para a próxima instrução de caso. Isso é proibido e causará um erro de compilation.

As instruções de casos vazias em C # combinam com a próxima não vazia?

Eu originalmente disse:

A questão supõe uma falsidade. Não existe uma seção de switch vazia em um programa C # legal.

Isso não é bem verdade. A especificação C # requer que uma seção de opção contenha pelo menos uma instrução, mas a implementação, na verdade, não.

Eu emendo minha declaração da seguinte forma:

A questão supõe que há uma seção de switch vazia (note que as seções de switch não são instruções ), mas só pode haver uma seção de switch vazia em uma situação muito incomum. Primeiramente, vamos descrever claramente a anatomia de uma instrução switch.

Quando voce tem:

 switch(x) { case 1: case 2: Console.WriteLine("Hello"); break; } 

existe apenas uma seção de chave . Não há “seção vazia” após o caso 1; uma seção consiste em todas as cláusulas do caso seguidas por zero ou mais instruções. (A especificação requer uma ou mais instruções, mas a implementação na verdade permite instruções zero.) A lista de instruções deve ter um ponto de extremidade não alcançável.

A única maneira de existir uma lista de instruções vazia cujo ponto final não é alcançável dentro de uma seção de opção é a própria seção de opção inacessível. Existem duas maneiras que podem acontecer. O switch inteiro pode estar inacessível ou o switch pode estar alternando uma constante. Em suma, a única maneira de fazer uma seção de switch vazia é:

 switch(1) { case 2: } 

ou

 if (false) switch(x) { case 2: } 

Nem é legal de acordo com a especificação, mas o compilador C # permite ambos. Felizmente, esse é um bug bastante inofensivo.

Em ambos os casos, o ponto final da seção não é alcançável e, portanto, a seção vazia é alcançável. Mas nunca é o caso de haver uma seção vazia entre os casos .

Com base nos testes, você pode fazer o seguinte:

 switch(i) { case 0: case 1: case 2: doSomething(); break; default: doNothing(); break; } 

Mas você não pode:

 switch(i) { case 0: doSomething(); case 1: doSomethingElse(); break; default: doNothing(); break; } 

Assim, a resposta é, sim, você pode empilhar vários casos juntos, mas você não pode deixar o controle ser executado de um caso para outro.