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


156

存在する検索テキストボックスに応じて、検索フィールドに検索語を入力するスイッチステートメントを記述しようとしています。次のコードがあります。しかし、「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":)から別のケースラベルに移動できません

回答:


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 2013年

13
またbreak、状況によっては解決策が必要になるため、私のソリューションで不要な場合はどうなりますか?
ブラック

10
わあ、C#の開発者たちは一体何を考えていたのですか。私が知っているすべてのプログラミング言語で動作しますが、C#では動作しません。
ブラック、

8
この答えが欠けているのは、を使用してもCスタイルのフォールスルーを実行できるという事実ですgoto case "some String"
NH。

3
気づかなかった。VBには、C ++のケースフォールスルー機能がないといつも思っていました。C#にもないことがわかりました。また、傷害に侮辱を加えるには、breakステートメントを入力する必要があります。自動入力すらしません。
Brain2000 2018年

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も可能です
トビアスヴァリンスキー2014

3
誰でも-なぜ-これがそうであるか説明できますか コードを実行するための正当なユースケースがあり、制御を次のケースに移すように感じます。
YasharBahman、2014

9
@YasharBahman、ケースフォールスルーをサポートする言語には、意図したケースよりもはるかに多くのバグがあると思います。C#では、この言語を使用することで、goto case "SearchBooks";表現力を大幅に失うことなく、予期しないバグを追加することなく、必要なことを実行できます。
agent-j

2
@ agent-jなるほど。ありがとう、それは非常に理にかなっています。また、gotoがそのように使用できることを知りませんでした。(ただし、教授は私が自発的に燃焼すると確信しているので、私は常にそれを使用することにうんざりすると思います)
YasharBahman

2
これはなぜ受け入れられた答えではないのですか?これは、switchステートメントに使用できるオプションの詳細と、質問への回答を示します。
DotNetプログラマ、2015

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 -あなたは、制御フローは次の意味に1 case文から「を通じて落ち」だろう伝統的なCスタイルのswitch文で、中に書いたように、そのコードのすべての4行場合に実行されsearchType == "SearchBooks"ます。

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

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


1
ここにCのようなスイッチを複製する方法はありますか?1つのスイッチでいくつかのコードを実行してから、みんなのために実行される別のスイッチにフォールスルーしますか?
John Demetriou

@JohnDemetriouこれを複製するには、go to caseステートメントを使用できます。
itsme.cvk 2017

4

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

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

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

            }

4

他の回答では言及されていないため、他の一部のプログラミング言語で「ブレーク」を省略した場合と同様に、最初のケースが完了した直後にケース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;
}

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 2016

1
1.あなたは「母音」対「アルファベット」を意味したと思います。2. switch (ch)次のように変更したい場合があります。 char vowelCheckChar = ( (Char.ToLower(ch) == 'y') ? ( ((new Random()).Next(2) == 0) ? ch : 'a' ) : ch ); // char vowelCheckChar = switch (vowelCheckChar)すみません、しなければなりませんでした。;)
トム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.