控件不能通过一个大小写标签

我试图写一个开关语句,将类型的搜索字段中的搜索条件取决于哪个搜索文本框目前。我有以下密码。但是我收到一个“ Control can not fall through from one case label”错误。

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":)落到另一个案例标签

298271 次浏览

你错过了一些休息时间:

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 # 中是不允许的。

通过在每个用例结束时添加 break语句,程序在完成每个用例后退出,以 searchType的值为准。

你需要 break;throwgoto,或 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;

您需要添加一个 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 case 或者 the SearchAuthors——就像你写的那样,在传统的 C 风格 switch 语句中,控制流会从一个 case 语句“掉到”下一个 case 语句,这意味着在 searchType == "SearchBooks"的情况下,所有4行代码都会被执行。

您看到的编译器错误是为了(至少部分地)警告程序员这个潜在错误而引入的。

作为替代方法,您可能会抛出错误或从方法返回。

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();


}
}
}

在 C # 中,你可以做更多的事情,但是你必须使用“可怕的”goto 语句。例如:

switch (whatever)
{
case 2:
Result.Write( "Subscribe" );
break;
case 1:
Result.Write( "Un" );
goto case 2;
}

在每个开关案例的末尾,只需添加 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;
}