O controle não pode passar de um rótulo de caso


156

Estou tentando escrever uma declaração de opção que digite o termo de pesquisa no campo de pesquisa, dependendo da caixa de texto de pesquisa presente. Eu tenho o seguinte código. Mas estou recebendo o erro "O controle não pode ser eliminado de um rótulo de caso".

switch (searchType)
{
    case "SearchBooks":
        Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchBooks_SearchBtn']");

    case "SearchAuthors":
        Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
}

O controle não pode passar de um rótulo de caso ( case "SearchBooks":) para outro

O controle não pode passar de um rótulo de caso ( case "SearchAuthors":) para outro

Respostas:


260

Você perdeu alguns intervalos lá:

switch (searchType)
{
    case "SearchBooks":
        Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
        break;

    case "SearchAuthors":
        Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
        break;
}

Sem eles, o compilador acha que você está tentando executar as linhas abaixo case "SearchAuthors":imediatamente após a execução das linhas abaixo case "SearchBooks":, o que não é permitido em C #.

Adicionando as breakinstruções no final de cada caso, o programa sai de cada caso após a conclusão, para qualquer valor de searchType.


31
Para mim, fiquei sentado olhando esse código e o meu próprio até finalmente perceber que estava realmente perdendo a folga no último caso, para quem acha isso útil.
somoso

13
E se minha solução não exigir, breakporque precisa cair em algumas circunstâncias ?!
Preto

10
uau, o que diabos os desenvolvedores de C # estavam pensando ?! Funciona em todas as linguagens de programação que conheço, mas não em c #.
Preto

8
A única coisa que falta nesta resposta é o fato de que você ainda pode fazer fall-throughs no estilo C usando goto case "some String".
NH.

3
Eu nunca percebi isso. Eu sempre pensei que o VB estava perdendo o recurso de fall-through do caso que o C ++ possui. Agora eu descubro que o C # também não tem, E para adicionar insulto à lesão, você deve digitar a instrução break. Nem sequer o preenche automaticamente.
precisa saber é o seguinte

138

Você precisa break;, throw, goto, ou returnde cada um dos seus casos etiquetas. Em um loop, você também pode continue.

        switch (searchType)
        {
            case "SearchBooks":
                Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
                Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
                break;

            case "SearchAuthors":
                Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
                Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
                break;
        }

A única vez que isso não é verdade é quando os rótulos dos casos são empilhados assim:

 case "SearchBooks": // no code inbetween case labels.
 case "SearchAuthors":
    // handle both of these cases the same way.
    break;

2
continuetambém é possível
Tobias Valinski

3
Alguém pode explicar -por que isso é? Sinto que existem casos de uso legítimos para executar código e o controle continua para o próximo caso.
YasharBahman

9
@YasharBahman, acho que há muito mais erros do que casos pretendidos em idiomas que suportam falhas de casos. No C #, o idioma permite que goto case "SearchBooks";você tenha a capacidade de fazer o que precisa sem perder muita expressividade ou adicionar bugs inesperados.
agent-j

2
@ agente-j eu vejo. Obrigado, isso faz muito sentido. Além disso, eu não sabia que você poderia usar goto assim, isso é muito legal! (embora, eu acho que eu vou sempre estar cansado de usá-lo desde que meus professores me convenceram de que eu vou entrar em combustão espontânea, se eu faço)
YasharBahman

2
Por que essa não é a resposta aceita? Ele informa mais sobre as opções que você tem para uma declaração de chave, além de fornecer a resposta para a pergunta.
DotNet Programmer

30

Você pode fazer mais do que apenas cair em c #, mas você deve utilizar a instrução goto "dreaded". Por exemplo:

switch (whatever)
{
  case 2:
    Result.Write( "Subscribe" );
    break;
  case 1:
    Result.Write( "Un" );
    goto case 2;
}

14

Você precisa adicionar uma declaração de quebra:

switch (searchType)
{
case "SearchBooks":
    Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
    Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
    break;
case "SearchAuthors":
    Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
    Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
    break;
}

Isso pressupõe que você deseja manipular o SearchBookscaso ou o SearchAuthors- como você havia escrito, em uma instrução de opção tradicional no estilo C - o fluxo de controle "passaria" de uma instrução de caso para a próxima, o que significa que todas as 4 linhas de código ser executado no caso em que searchType == "SearchBooks".

O erro do compilador que você está vendo foi introduzido (pelo menos em parte) para avisar o programador sobre esse erro em potencial.

Como alternativa, você poderia ter gerado um erro ou retornado de um método.


1
Existe uma maneira de replicar o comutador do tipo C aqui? Executar algum código em um switch e depois passar para outro que será executado para todos?
John Demetriou

@JohnDemetriou Você pode usar as instruções go to case para replicar o mesmo.
precisa saber é o seguinte

4

No final de cada caso de switch, basta adicionar a instrução break para resolver esse problema como este-

           switch (manu)
            {
                case manufacturers.Nokia:
                    _phanefact = new NokiaFactory();
                    break;

                case manufacturers.Samsung:
                    _phanefact = new SamsungFactory();
                    break;

            }

4

Como não foi mencionado nas outras respostas, gostaria de acrescentar que, se você deseja que o SearchAuthors do caso seja executado logo após a conclusão do primeiro caso, assim como ocorre ao omitir a "interrupção" em outras linguagens de programação onde isso for permitido, você pode simplesmente usar "ir".

switch (searchType)
{
    case "SearchBooks":
    Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
    Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
    goto case "SearchAuthors";

    case "SearchAuthors":
    Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
    Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
    break;
}

2

Você perdeu instruções de interrupção. Não se esqueça de inserir a declaração de interrupção, mesmo no caso padrão.

switch (searchType)
{
    case "SearchBooks":
        Selenium.Type("//*[@id='SearchBooks_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchBooks_SearchBtn']");
        break;

    case "SearchAuthors":
        Selenium.Type("//*[@id='SearchAuthors_TextInput']", searchText);
        Selenium.Click("//*[@id='SearchAuthors_SearchBtn']");
        break;
    default :
        Console.WriteLine("Default case handling");
        break;

}

0
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Case_example_1
{
    class Program
    {
        static void Main(string[] args)
        {
            Char ch;
            Console.WriteLine("Enter a character");
            ch =Convert.ToChar(Console.ReadLine());
            switch (ch)
            {
                case 'a':
                case 'e':
                case 'i':
                case 'o':
                case 'u':
                case 'A':
                case 'E':
                case 'I':
                case 'O':
                case 'U':

                    Console.WriteLine("Character is alphabet");
                    break;

                default:
                    Console.WriteLine("Character is constant");
                    break;

            }

            Console.ReadLine();

        }
    }
}

1
Você deve colocar algumas palavras ou algo para explicar por que isso é uma solução. Como você não explica por que precisa de intervalos para alguns e não para outros.
DotNet Programmer

3
você quis dizer "consoante"?
Maksymiuk

1
1. Acho que você quis dizer "vogal" x "alfabeto". 2. Você pode mudar switch (ch)para o seguinte. char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)Desculpe, tive que. ;)
Tom
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.