我正在尝试编写一个开关语句,该语句将根据存在的搜索文本框在搜索字段中键入搜索词。我有以下代码。但是我得到了一个"控制不能从一个案例标签上掉下来"。错误。
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 label (
case "SearchBooks":
)掉到另一个case label控制不能从一个case label (
case "SearchAuthors":
)掉到另一个case label
你错过了一些空格:
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":
下面的行被执行之后立即执行case "SearchAuthors":
下面的行,这在c#中是不允许的。
通过在每个case的末尾添加break
语句,对于searchType
的任何值,程序在完成后退出每个case。
您需要将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标签像这样堆叠时:
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风格切换语句中,控制流将从一个情况语句"跌落"到下一个情况,这意味着在searchType == "SearchBooks"
.
您看到的编译器错误(至少部分)是为了警告程序员这个潜在的错误。
作为另一种选择,您可以抛出错误或从方法返回。
在每个switch case的末尾添加break
-语句来解决这个问题
switch (manu)
{
case manufacturers.Nokia:
_phanefact = new NokiaFactory();
break;
case manufacturers.Samsung:
_phanefact = new SamsungFactory();
break;
}
您错过了break语句。即使在default
的情况下,也不要忘记使用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;
}
由于在其他答案中没有提到,我想补充一点,如果您希望在第一种情况之后立即执行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;
}
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();
}
}
}