[C#] 하나의 케이스 레이블에서 제어 할 수 없습니다

어떤 검색 텍스트 상자가 있는지에 따라 검색 필드에 검색어를 입력하는 스위치 문을 작성하려고합니다. 다음 코드가 있습니다. 그러나 “한 사례 레이블에서 제어 할 수 없습니다”오류가 발생합니다.

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":)에서 다른 사례 레이블 ( )로 통제를 넘어 설 수 없습니다



답변

거기에 몇 가지 휴식을 놓쳤다.

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하는 경우 또는SearchAuthors– 당신은 제어 흐름은 다음 의미 한 경우 문에서 “타락”을 것이다 전통적인 C 스타일의 switch 문에 작성했던대로 그 코드의 4 선 경우에 실행됩니다 searchType == "SearchBooks".

당신이보고있는 컴파일러 에러는 프로그래머에게이 잠재적 인 에러를 경고하기 위해 (적어도 부분적으로) 소개되었습니다.

대안으로 오류가 발생하거나 메소드에서 리턴 될 수 있습니다.


답변

각 스위치 케이스의 끝에 다음과 같이이 문제를 해결하기 위해 break 문을 추가하십시오.

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

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

            }


답변

다른 답변에서 언급되지 않았기 때문에 첫 번째 사례가 완료 된 직후 SearchAuthors를 실행하려면 다른 프로그래밍 언어에서 “break”를 생략 할 때와 마찬가지로 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;
}


답변

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;

}