存在する検索テキストボックスに応じて、検索フィールドに検索語を入力する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":」)から別のラベルにフォールスルーできません。
あなたはそこでいくつかの休憩を逃しました:
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
の値に関係なく、終了後に各ケースを終了します。
各ケースラベルからbreak;
、throw
、goto
、または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;
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
case またはSearchAuthors
を処理することを前提としています。記述したとおり、従来のCスタイルのswitchステートメントでは、制御フローは1つのcaseステートメントから「フォールスルー」します次に、searchType == "SearchBooks"
の場合に4行のコードすべてが実行されることを意味します。
表示されているコンパイラエラーは、プログラマにこの潜在的なエラーを警告するために導入されました(少なくとも部分的に)。
別の方法として、エラーをスローしたり、メソッドから返された可能性があります。
各switchケースの最後にbreakステートメントを追加して、このような問題を解決します。
switch (manu)
{
case manufacturers.Nokia:
_phanefact = new NokiaFactory();
break;
case manufacturers.Samsung:
_phanefact = new SamsungFactory();
break;
}
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;
}
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();
}
}
}
他の回答では言及されていないので、他のプログラミング言語で「ブレーク」を省略した場合と同様に、最初のケースが完了した直後にケース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;
}