Il controllo non può passare da un'etichetta del caso


156

Sto provando a scrivere un'istruzione switch che digiti il ​​termine di ricerca nel campo di ricerca a seconda della casella di testo di ricerca presente. Ho il codice seguente. Ma sto ricevendo un errore "Il controllo non può passare da un'etichetta di 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']");
}

Il controllo non può passare da un'etichetta del caso ( case "SearchBooks":) a un'altra

Il controllo non può passare da un'etichetta del caso ( case "SearchAuthors":) a un'altra

Risposte:


260

Ti sei perso alcune pause 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;
}

Senza di essi, il compilatore pensa che stai cercando di eseguire le righe sottostanti case "SearchAuthors":immediatamente dopo l' esecuzione delle righe sottostanti case "SearchBooks":, cosa non consentita in C #.

Aggiungendo le breakistruzioni alla fine di ogni caso, il programma esce da ogni caso dopo che è stato eseguito, per qualunque valore di searchType.


31
Per quanto mi riguarda, mi sono seduto lì a guardare questo codice e il mio fino a quando ho finalmente capito che in realtà mi mancava l'interruzione nell'ultimo caso, per chiunque lo trovasse utile.
somoso,

13
E cosa succede se la mia soluzione non richiede breakperché deve cadere in alcune circostanze ?!
Nero,

10
wow, che diamine stavano pensando gli sviluppatori C # ?! Funziona in tutti i linguaggi di programmazione che conosco, ma non in C #.
Nero,

8
L'unica cosa che manca a questa risposta è il fatto che puoi ancora fare fall-through C-Style usando goto case "some String".
NH.

3
Non l'ho mai capito. Ho sempre pensato che a VB mancasse la funzionalità fall-through di C ++. Ora scopro che C # non ce l'ha nemmeno E, per aggiungere un insulto a un infortunio, devi digitare la frase di interruzione. Non lo riempirà nemmeno automaticamente.
Brain2000,

138

È necessario break;, throw, goto, o returnda ciascuno dei vostri casi di etichette. In un ciclo puoi anche 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;
        }

L'unica volta che questo non è vero è quando le etichette del caso sono impilate in questo modo:

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

2
continueè anche possibile
Tobias Valinski,

3
Qualcuno può spiegare -perché- questo è? Sento che ci sono casi d'uso legittimi per eseguire il codice e che il controllo continui a passare al caso successivo.
YasharBahman,

9
@YasharBahman, penso che ci siano molti più bug dei casi previsti in lingue che supportano il fall-case. In C #, il linguaggio ti consente di goto case "SearchBooks";avere la possibilità di fare ciò che devi fare senza perdere molta espressività o aggiungere bug imprevisti.
agente-j,

2
@ agente-j vedo. Grazie, ha molto senso. Inoltre, non sapevo che avresti potuto usare Goto in quel modo, è davvero fantastico! (anche se penso che sarò sempre stanco di usarlo dato che i miei professori mi hanno convinto che lo farò spontaneamente se lo faccio)
YasharBahman,

2
Perché questa non è la risposta accettata? Fornisce maggiori informazioni sulle opzioni disponibili per un'istruzione switch e fornisce la risposta alla domanda.
Programmatore DotNet,

30

Puoi fare molto di più che passare semplicemente in C #, ma devi utilizzare l'istruzione goto "temuta". Per esempio:

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

14

Devi aggiungere un'istruzione break:

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;
}

Ciò presuppone che tu voglia gestire il SearchBookscaso o il SearchAuthors- come avevi scritto, in un'istruzione switch in stile C tradizionale il flusso di controllo sarebbe "passato" da un'istruzione case al successivo significato che tutte e 4 le righe di codice viene eseguito nel caso in cui searchType == "SearchBooks".

L'errore del compilatore che stai vedendo è stato introdotto (almeno in parte) per avvisare il programmatore di questo potenziale errore.

In alternativa, potresti aver generato un errore o restituito da un metodo.


1
C'è un modo per replicare l'interruttore C-like qui? Esegui un po 'di codice in un interruttore e poi passa a un altro che verrà eseguito per tutti?
John Demetriou,

@JohnDemetriou È possibile utilizzare le istruzioni go to case per replicare lo stesso.
itsme.cvk,

4

Alla fine di ogni caso switch basta aggiungere l'istruzione break per risolvere questo problema come questo-

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

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

            }

4

Dal momento che non è stato menzionato nelle altre risposte, vorrei aggiungere che se si desidera che SearchAuthors del caso venga eseguito subito dopo il primo caso, proprio come accade quando si omette la "rottura" in alcuni altri linguaggi di programmazione dove è consentito, puoi semplicemente usare "goto".

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

Hai perso le dichiarazioni di interruzione. Non dimenticare di inserire l'istruzione di interruzione anche nel caso predefinito.

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
Dovresti mettere qualche parola o qualcosa per spiegare perché questa è una soluzione. Dal momento che non spieghi perché hai bisogno delle pause per alcuni e non per altri.
Programmatore DotNet,

3
intendevi "consonante"?
Maksymiuk,

1
1. Penso che volevi dire "vocale" vs. "alfabeto". 2. È possibile che si desideri modificare switch (ch)quanto segue. char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)Scusa, ho dovuto. ;)
Tom,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.