我正在尝试编写一个switch语句,它会在搜索字段中键入搜索词,具体取决于存在哪个搜索文本框。我有以下代码。但我得到一个“控件无法从一个案例标签中落空”的错误。请让我知道如何解决这个问题。提前谢谢!
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']");
}
控制不能从一个案例标签('case“SearchBooks”:')转移到另一个案例标签
控件不能从一个案例标签('case“SearchAuthors”:')转到另一个
答案 0 :(得分:219)
你错过了一些休息时间:
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;
}
如果没有它们,编译器会认为您在执行case "SearchAuthors":
下的行后立即执行case "SearchBooks":
下面的行,这在C#中是不允许的。
通过在每个案例结尾处添加break
语句,程序在完成后退出每个案例,以及searchType
的任何值。
答案 1 :(得分:124)
您需要从每个案例标签中break;
,throw
,goto
或return
。在循环中,您还可以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;
}
唯一不适用的是案例标签堆叠如下:
case "SearchBooks": // no code inbetween case labels.
case "SearchAuthors":
// handle both of these cases the same way.
break;
答案 2 :(得分:23)
你可以做的不仅仅是在C#中,但你必须使用“可怕的”goto语句。例如:
switch (whatever)
{
case 2:
Result.Write( "Subscribe" );
break;
case 1:
Result.Write( "Un" );
goto case 2;
}
答案 3 :(得分:13)
您需要添加一个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;
}
这假设您要处理SearchBooks
案例或 SearchAuthors
- 正如您所写,在传统的C风格切换语句中控制流程会从一个case语句“下降”到下一个意味着在searchType == "SearchBooks"
的情况下执行所有4行代码。
您所看到的编译器错误(至少部分地)被引入以警告程序员此潜在错误。
作为替代方案,您可能会抛出错误或从方法返回。
答案 4 :(得分:3)
在每个开关案例的最后,只需添加break语句来解决此问题 -
switch (manu)
{
case manufacturers.Nokia:
_phanefact = new NokiaFactory();
break;
case manufacturers.Samsung:
_phanefact = new SamsungFactory();
break;
}
答案 5 :(得分:2)
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();
}
}
}
答案 6 :(得分:2)
你错过了休息陈述。即使在默认情况下也不要输入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;
default :
Console.WriteLine("Default case handling");
break;
}
答案 7 :(得分:0)
由于没有在其他答案中提及,因此我想补充一下,如果您希望在第一种情况完成后立即执行Case SearchAuthors,就像在某些情况下省略“ break”时一样其他允许的编程语言,则只需使用“ 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;
}