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

时间:2011-07-14 16:28:38

标签: 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']");
}
  

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

     

控件不能从一个案例标签('case“SearchAuthors”:')转到另一个

8 个答案:

答案 0 :(得分:219)

你错过了一些休息时间:

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的任何值。

答案 1 :(得分:124)

您需要从每个案例标签中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;

答案 2 :(得分:23)

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

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

答案 3 :(得分:13)

您需要添加一个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风格切换语句中控制流程会从一个case语句“下降”到下一个意味着在searchType == "SearchBooks"的情况下执行所有4行代码。

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

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

答案 4 :(得分:3)

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

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

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

            }

答案 5 :(得分: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();

        }
    }
}

答案 6 :(得分: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;
    default :
        Console.WriteLine("Default case handling");
        break;

}

答案 7 :(得分:0)

由于没有在其他答案中提及,因此我想补充一下,如果您希望在第一种情况完成后立即执行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;
}