控件不能脱离一个案例标签


156

我试图编写一个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":)落入另一个案例标签()

Answers:


260

您错过了一些休息时间:

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


31
对我来说,我坐在那里看着这段代码和我自己的代码,直到我最终意识到我实际上错过了最后一个案例的中断,对于任何认为有帮助的人。
somoso

13
如果我的解决方案不需要,break因为在某些情况下需要解决该怎么办?!
黑色

10
哇,C#开发人员在想什么?!它适用于我所知道的每种编程语言,但不适用于C#。
黑色

8
缺少此答案的一件事是,您仍然可以使用进行C-Style穿插goto case "some String"
NH。

3
我从来没有意识到这一点。我一直以为VB缺少C ++具有的区分大小写功能。现在,我发现C#也没有它,并且要增加对侮辱的伤害,您必须键入break语句。它甚至不会自动填充。
Brain2000 '18

138

你需要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;

2
continue也是可能的
Tobias Valinski 2014年

3
谁能解释-为什么-这是吗?我觉得这里有合法的用例来执行代码,并使控制权持续到下一个用例。
YasharBahman 2014年

9
@YasharBahman,我认为在支持案例分析的语言中,比预期的案例有更多的错误。在C#中,该语言允许您goto case "SearchBooks";执行操作,而不必失去太多的表达能力或添加意外的错误,就可以执行所需的操作。
agent-j

2
@ agent-j我明白了。谢谢,这很有意义。另外,我不知道您可以使用goto这样,真的很棒!(尽管,我认为我会一直对使用它感到厌倦,因为我的教授已经说服我,如果我这样做我会自发燃烧)
YasharBahman 2014年

2
为什么这个不是公认的答案?它提供了更多有关switch语句的选项以及给出问题答案的信息。
DotNet程序员

30

您不仅可以完成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"

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

或者,您可能抛出错误或从方法返回。


1
有没有办法在这里复制类似C的开关?在一个开关中运行一些代码,然后遍历另一个将为每个人运行的代码?
John Demetriou 2015年

@JohnDemetriou您可以使用go to case语句复制相同的语句。
itsme.cvk

4

在每个switch案例的末尾,只需添加break语句即可解决此问题,例如:

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

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

            }

4

既然在其他答案中都没有提到它,那么我想补充一下,如果您希望在第一种情况完成后立即执行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;
}

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

        }
    }
}

1
您应该说些什么或什么来解释为什么这是一个解决方案。由于您不解释为什么需要休息,而不需要休息。
DotNet程序员

3
你是说“辅音”吗?
maksymiuk

1
1.我认为您的意思是“元音”与“字母”。2.您可能需要更改switch (ch)为以下内容。 char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)抱歉,必须。;)
汤姆(Tom
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.