web-dev-qa-db-ja.com

コントロールは1つのケースラベルから抜けることができません

存在する検索テキストボックスに応じて、検索フィールドに検索語を入力するswitchステートメントを記述しようとしています。私は次のコードを持っています。しかし、「コントロールは1つのケースラベルから抜けることができません」というエラーが表示されます。これを修正する方法を教えてください。前もって感謝します!

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

コントロールは、1つのケースラベル(「case "SearchBooks":」)から別のラベルにフォールスルーできません。

コントロールは、1つのケースラベル(「case "SearchAuthors":」)から別のラベルにフォールスルーできません。

129
Maya

あなたはそこでいくつかの休憩を逃しました:

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の値に関係なく、終了後に各ケースを終了します。

221
BoltClock

各ケースラベルから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;
125
agent-j

C#で単に失敗するだけではありませんが、「恐ろしい」gotoステートメントを利用する必要があります。例えば:

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

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 case またはSearchAuthorsを処理することを前提としています。記述したとおり、従来のCスタイルのswitchステートメントでは、制御フローは1つのcaseステートメントから「フォールスルー」します次に、searchType == "SearchBooks"の場合に4行のコードすべてが実行されることを意味します。

表示されているコンパイラエラーは、プログラマにこの潜在的なエラーを警告するために導入されました(少なくとも部分的に)。

別の方法として、エラーをスローしたり、メソッドから返された可能性があります。

13
Justin

各switchケースの最後にbreakステートメントを追加して、このような問題を解決します。

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

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

            }
3
Debendra Dash

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;

}
2
husnain shabbir
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
Bob Maharjan

他の回答では言及されていないので、他のプログラミング言語で「ブレーク」を省略した場合と同様に、最初のケースが完了した直後にケースSearchAuthorsを実行したい場合は追加したいと思いますそれが許可されている場合は、単に「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;
}
0
Ouissal