我正在尝试编写一个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”:')转移到另一个案例标签
你错过了一些休息时间:
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
的值是多少。
您需要从每个案例标签中选择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;
你可以做的不仅仅是在C#中,但你必须使用“可怕的”goto语句。例如:
switch (whatever)
{
case 2:
Result.Write( "Subscribe" );
break;
case 1:
Result.Write( "Un" );
goto case 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;
}
这假设你想要处理SearchBooks
案例或SearchAuthors
--正如你所写的那样,在传统的C风格的switch语句中,控制流将从一个case语句“落到”下一个意味着所有4行代码在searchType == "SearchBooks"
的情况下执行。
您看到的编译器错误(至少部分地)被引入以警告程序员这个潜在的错误。
作为替代方案,您可能抛出错误或从方法返回。
在每个开关案例的最后,只需添加break语句来解决此问题,如下所示 -
switch (manu)
{
case manufacturers.Nokia:
_phanefact = new NokiaFactory();
break;
case manufacturers.Samsung:
_phanefact = new SamsungFactory();
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();
}
}
}
你错过了break语句。即使在默认情况下也不要忘记输入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;
}
由于在其他答案中没有提及,我想补充一点,如果你想在第一个案例完成后立即执行案例SearchAuthors,就像在其他一些编程语言中省略“break”的情况一样在哪里,你可以简单地使用“转到”。
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;
}