控制不能从一个案例标签中删除

May*_*aya 140 c# switch-statement

我正在尝试编写一个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']");
}
Run Code Online (Sandbox Code Playgroud)

控制不能从一个案例标签('case"SearchBooks":')转到另一个案例标签

控制不能从一个案例标签('case"SearchAuthors":')转移到另一个案例标签

Bol*_*ock 238

你错过了一些休息时间:

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;
}
Run Code Online (Sandbox Code Playgroud)

如果没有它们,编译器会认为您在执行下面case "SearchAuthors":的行之后立即执行下面的行case "SearchBooks":,这在C#中是不允许的.

通过break在每个案例结尾处添加语句,程序在完成后退出每个案例,无论哪个值searchType.

  • 对我来说,我坐在那里看着这个代码和我自己的代码直到我终于意识到我实际上错过了最后一个案例的休息时间,对于那些发现有用的人来说. (31认同)
  • 如果我的解决方案不需要"break",因为在某些情况下需要通过它会怎么样? (9认同)
  • 哇,C#开发人员在想什么?!它适用于我所知道的每种编程语言,但不适用于C#. (7认同)
  • C# 以正确的方式做到了这一点。C# 开发人员都是天才。其他语言(如 C++)使用的失败机制是一个错误。C# 通过“goto case”显式失败的要求更安全、更强大、更清晰。您不仅可以实现“失败”行为,还可以明确“明确地失败到任何情况”。在其他语言中,“跌倒”是一个懒惰的笑话。C# 旨在解决旧语言中所有这些奇怪且容易出错的问题。 (5认同)
  • 缺少此答案的一件事是,您仍然可以使用goto case“ some String”`进行C样式插入。 (3认同)
  • @j riv:不,它没有.从不存在switch语句中需要空的默认情况的情况.C#不允许这个时期,除非你说在即将发布的规范修订版中已经改变了. (2认同)
  • 我从来没有意识到这一点。我一直以为VB缺少C ++具有的区分大小写功能。现在,我发现C#也没有它,并且要增加对侮辱的伤害,您必须键入break语句。它甚至不会自动填充。 (2认同)

age*_*t-j 132

你需要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;
        }
Run Code Online (Sandbox Code Playgroud)

唯一不合适的情况是案例标签堆叠如下:

 case "SearchBooks": // no code inbetween case labels.
 case "SearchAuthors":
    // handle both of these cases the same way.
    break;
Run Code Online (Sandbox Code Playgroud)

  • 详细说明有"break"替代品的+1. (30认同)
  • @YasharBahman,我认为在支持案例落后的语言中,有比预期案例更多的错误.在C#中,该语言允许您"转到大小写"SearchBooks";`因此,您可以在不失去太多表现力或添加意外错误的情况下完成您需要做的事情. (8认同)
  • 谁能解释 - 为什么 - 这是?我觉得有合法的用例来执行代码并让控制权继续下降到下一个案例。 (3认同)
  • `continue`也是可能的 (2认同)
  • @ agent-j我明白了.谢谢,这很有道理.另外,我不知道你可以使用这样的goto,这真的很酷!(虽然,我想我总是厌倦了使用它,因为我的教授已经说服我,如果我这样做会自发燃烧) (2认同)
  • 为什么这个不是公认的答案?它告诉您有关switch语句的选项以及给出问题答案的更多信息. (2认同)

Dar*_*ola 27

你可以做的不仅仅是在C#中,但你必须使用"可怕的"goto语句.例如:

switch (whatever)
{
  case 2:
    Result.Write( "Subscribe" );
    break;
  case 1:
    Result.Write( "Un" );
    goto case 2;
}
Run Code Online (Sandbox Code Playgroud)


Jus*_*tin 14

您需要添加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;
}
Run Code Online (Sandbox Code Playgroud)

这是假设你想要么处理SearchBooks情况SearchAuthors-为你写的,在传统的C风格的switch语句的控制流会"跌穿"从一个case语句到下一个意思,所有的4行代码在这种情况下执行searchType == "SearchBooks".

您看到的编译器错误(至少部分地)被引入以警告程序员这个潜在的错误.

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


Deb*_*ash 5

在每个 switch case 的末尾,只需添加break-statement 即可解决此问题

switch (manu)
{
    case manufacturers.Nokia:
        _phanefact = new NokiaFactory();
        break;

    case manufacturers.Samsung:
        _phanefact = new SamsungFactory();
        break;  
}
Run Code Online (Sandbox Code Playgroud)


Hus*_*bir 5

你错过了break语句。break即使在这种情况下也不要忘记使用- 语句default

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;
}
Run Code Online (Sandbox Code Playgroud)