控制不能从一个案例标签失效



我正在尝试编写一个开关语句,该语句将根据存在的搜索文本框在搜索字段中键入搜索词。我有以下代码。但是我得到了一个"控制不能从一个案例标签上掉下来"。错误。

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, gotoreturn从您的每个案例标签中删除。在循环中,您还可以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" .

的情况下执行所有4行代码。

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

作为另一种选择,您可以抛出错误或从方法返回。

在每个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();
        }
    }
}

最新更新