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

问题描述 投票:128回答:8

我正在尝试编写一个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”:')转移到另一个案例标签

c# switch-statement
8个回答
224
投票

你错过了一些休息时间:

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的值是多少。


126
投票

您需要从每个案例标签中选择break;throwgotoreturn。在循环中你也可以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;

23
投票

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

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

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;
}

这假设你想要处理SearchBooks案例或SearchAuthors--正如你所写的那样,在传统的C风格的switch语句中,控制流将从一个case语句“落到”下一个意味着所有4行代码在searchType == "SearchBooks"的情况下执行。

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

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


3
投票

在每个开关案例的最后,只需添加break语句来解决此问题,如下所示 -

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

                case manufacturers.Samsung:
                    _phanefact = new SamsungFactory();
                    break;

            }

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

        }
    }
}

2
投票

你错过了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;

}

0
投票

由于在其他答案中没有提及,我想补充一点,如果你想在第一个案例完成后立即执行案例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;
}
© www.soinside.com 2019 - 2024. All rights reserved.