J'essaie d'écrire une instruction switch 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 je reçois une erreur "Le contrôle ne peut pas tomber de la part d’une seule étiquette". S'il vous plaît laissez-moi savoir comment résoudre ce problème. Merci d'avance!
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 tomber d'une étiquette de cas ('cas "SearchBooks":') à une autre
Le contrôle ne peut pas passer d'une étiquette de cas ('case "SearchAuthors":') à une autre
Vous avez manqué des pauses ici:
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 sous case "SearchAuthors":
immédiatement après que les lignes sous case "SearchBooks":
aient été exécutées, ce qui n'est pas autorisé en C #.
En ajoutant les instructions break
à la fin de chaque cas, le programme quitte chaque cas une fois l'opération terminée, quelle que soit la valeur de searchType
.
Vous devez break;
, throw
, goto
ou return
à partir de chacune de vos étiquettes de cas. Dans une boucle, vous pouvez également 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;
}
La seule fois où ce n'est pas vrai, c'est quand 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;
Vous pouvez faire plus que tomber dans C #, mais vous devez utiliser la déclaration "redoutée" de goto. Par exemple:
switch (whatever)
{
case 2:
Result.Write( "Subscribe" );
break;
case 1:
Result.Write( "Un" );
goto case 2;
}
Vous devez ajouter une déclaration de pause:
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 cas SearchBooks
o le SearchAuthors
- comme vous l'avez écrit, dans une instruction de commutateur de style C traditionnelle, le flux de contrôle aurait " tombé "d'une instruction case à la suivante, ce qui signifie que les 4 lignes de code sont exécutées dans le cas où searchType == "SearchBooks"
.
L'erreur de compilation que vous voyez a été introduite (au moins en partie) pour avertir le programmeur de cette erreur potentielle.
Au lieu de cela, vous pourriez avoir renvoyé une erreur ou renvoyé une méthode.
À la fin de chaque cas de commutateur, ajoutez simplement l'instruction break pour résoudre ce problème de la manière suivante:
switch (manu)
{
case manufacturers.Nokia:
_phanefact = new NokiaFactory();
break;
case manufacturers.Samsung:
_phanefact = new SamsungFactory();
break;
}
Vous avez manqué des déclarations de rupture. N'oubliez pas de saisir une déclaration de rupture, 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;
}
Etant donné que cela n’a pas été mentionné dans les autres réponses, je voudrais ajouter que si vous voulez que les auteurs de recherche de cas soient exécutés juste après que le premier cas soit terminé, comme c’est le cas lorsque vous omettez la "pause" dans d’autres langages de programmation. là où cela est permis, 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;
}
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();
}
}
}