Le contrôle ne peut pas passer d'une étiquette de cas

156

J'essaie d'écrire une instruction de commutation qui taperait le terme de recherche dans le champ de recherche en fonction de la zone de texte de recherche présente. J'ai le code suivant. Mais j'obtiens une erreur "Le contrôle ne peut pas passer d'une étiquette de cas".

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']");
}

Le contrôle ne peut pas passer d'une étiquette de cas ( case "SearchBooks":) à une autre

Le contrôle ne peut pas passer d'une étiquette de cas ( case "SearchAuthors":) à une autre

Maya
la source

Réponses:

260

Vous avez manqué quelques pauses là-bas:

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

Sans eux, le compilateur pense que vous essayez d'exécuter les lignes ci case "SearchAuthors":- dessous immédiatement après l' exécution des lignes ci - dessous case "SearchBooks":, ce qui n'est pas autorisé en C #.

En ajoutant les breakinstructions à la fin de chaque cas, le programme quitte chaque cas une fois terminé, quelle que soit la valeur de searchType.

BoltClock
la source
31
Pour moi, je me suis assis là à regarder ce code et le mien jusqu'à ce que je réalise enfin que je manquais la pause sur le tout dernier cas, pour tous ceux qui trouvent cela utile.
somoso
13
Et si ma solution n'exige pas breakparce qu'elle doit échouer dans certaines circonstances?!
Noir du
10
wow, à quoi pensaient les développeurs C #?! Cela fonctionne dans tous les langages de programmation que je connais, mais pas en C #.
Noir
8
La seule chose qui manque à cette réponse est le fait que vous pouvez toujours faire des erreurs C-Style en utilisant goto case "some String".
NH.
3
Je n'ai jamais réalisé cela. J'ai toujours pensé que VB manquait la fonctionnalité de remplacement de cas que C ++ a. Maintenant, je découvre que C # ne l'a pas non plus, ET pour ajouter une insulte à la blessure, vous devez taper l'instruction break. Il ne le remplira même pas automatiquement.
Brain2000
138

Vous devez break;, throw, gotoou returnde chacun de vos étiquettes de cas. Dans une boucle, vous pouvez aussi 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;
        }

Le seul moment où ce n'est pas vrai, c'est lorsque les étiquettes de cas sont empilées comme ceci:

 case "SearchBooks": // no code inbetween case labels.
 case "SearchAuthors":
    // handle both of these cases the same way.
    break;
agent-j
la source
2
continueest possible aussi
Tobias Valinski
3
Quelqu'un peut-il expliquer - pourquoi - c'est? J'ai l'impression qu'il existe des cas d'utilisation légitimes pour exécuter du code et faire en sorte que le contrôle continue de passer au cas suivant.
YasharBahman
9
@YasharBahman, je pense qu'il y a beaucoup plus de bogues que de cas prévus dans les langages qui prennent en charge le basculement des cas. En C #, le langage vous permet goto case "SearchBooks";de faire ce que vous devez faire sans perdre beaucoup d'expressivité ou ajouter des bogues inattendus.
agent-j
2
@ agent-j je vois. Merci, cela a beaucoup de sens. De plus, je ne savais pas que vous pouviez utiliser goto comme ça, c'est vraiment cool! (bien que je pense que je serai toujours fatigué de l'utiliser puisque mes professeurs m'ont convaincu que je brûlerai spontanément si je le fais)
YasharBahman
2
Pourquoi celle-ci n'est-elle pas la réponse acceptée? Il en dit plus sur les options dont vous disposez pour une instruction switch et donne la réponse à la question.
Programmeur DotNet
30

Vous pouvez faire plus que simplement tomber en C #, mais vous devez utiliser l'instruction goto "redoutée". Par exemple:

switch (whatever)
{
  case 2:
    Result.Write( "Subscribe" );
    break;
  case 1:
    Result.Write( "Un" );
    goto case 2;
}
Darwin Airola
la source
14

Vous devez ajouter une instruction 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;
}

Cela suppose que vous souhaitiez gérer le SearchBookscas ou le SearchAuthors- comme vous l'aviez écrit, dans une instruction de commutateur de style C traditionnelle, le flux de contrôle aurait "échoué" d'une instruction de cas à la suivante, ce qui signifie que les 4 lignes de code être exécuté dans le cas où searchType == "SearchBooks".

L'erreur du compilateur que vous voyez a été introduite (au moins en partie) pour avertir le programmeur de cette erreur potentielle.

Comme alternative, vous pourriez avoir généré une erreur ou renvoyé une méthode.

Justin
la source
1
Existe-t-il un moyen de répliquer le commutateur de type C ici? Exécuter du code dans un commutateur, puis passer à un autre qui fonctionnera pour tout le monde?
John Demetriou
@JohnDemetriou Vous pouvez utiliser les instructions go to case pour répliquer la même chose.
itsme.cvk
4

À la fin de chaque cas de commutation, ajoutez simplement l'instruction break pour résoudre ce problème comme ceci:

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

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

            }
Debendra Dash
la source
4

Comme cela n'a pas été mentionné dans les autres réponses, j'aimerais ajouter que si vous voulez que le cas SearchAuthors soit exécuté juste après le premier cas, tout comme c'est le cas lorsque vous omettez le "break" dans certains autres langages de programmation là où cela est autorisé, vous pouvez simplement utiliser "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;
}
Ouissal
la source
2

Vous avez manqué des instructions break. N'oubliez pas de saisir une instruction break même dans le cas par défaut.

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;

}
Husnain Shabbir
la source
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();

        }
    }
}
Bob Maharjan
la source
1
Vous devriez mettre quelques mots ou quelque chose pour expliquer pourquoi c'est une solution. Puisque vous n'expliquez pas pourquoi vous avez besoin des pauses pour certains et pas pour d'autres.
Programmeur DotNet
3
vouliez-vous dire «consonne»?
maksymiuk
1
1. Je pense que vous vouliez dire "voyelle" contre "alphabet". 2. Vous souhaiterez peut-être passer switch (ch)à ce qui suit. char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)Désolé, je devais le faire. ;)
Tom