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


156

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

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

답변:


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상황에서 해결책을 찾아야 하므로 솔루션에 필요하지 않으면 어떻게 합니까?!
Black

10
와우, C # 개발자들은 무엇을 생각하고 있었습니까?! 내가 아는 모든 프로그래밍 언어에서 작동하지만 C #에서는 작동하지 않습니다.
Black

8
이 답변에서 누락 된 것은 여전히을 사용하여 C 스타일 폴 스루를 수행 할 수 있다는 것입니다 goto case "some String".
NH.

3
나는 이것을 깨닫지 못했습니다. 나는 항상 VB에 C ++의 대소 사고 기능이 누락되었다고 생각했습니다. 이제 C #에 C #이 없으며 부상을 입히려면 break 문을 입력해야합니다. 자동 완성되지도 않습니다.
Brain2000

138

당신은 필요에 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;

2
continue뿐만 아니라 가능하다
토비아스 Valinski

3
누구든지 설명 할 수 있습니까-왜-이것이입니까? 코드를 실행할 수있는 합법적 인 사용 사례가 있고 다음 사례로 계속 통제 할 수 있다고 생각합니다.
YasharBahman

9
@YasharBahman은 대소 문자를 지원하는 언어의 의도 된 경우보다 훨씬 더 많은 버그가 있다고 생각합니다. C #에서 언어를 사용하면 goto case "SearchBooks";표현력을 잃거나 예기치 않은 버그를 추가하지 않고도 필요한 작업을 수행 할 수 있습니다.
agent-j

2
@ agent-j 알겠습니다. 고마워요. 또한, 나는 당신이 그런 goto를 사용할 수 있다는 것을 몰랐습니다. 정말 멋집니다! (하지만 교수님이 제가 자발적으로 타 버릴 것이라고 확신
하셨기

2
이것이 왜 대답이 아닌가? switch 문에 어떤 옵션이 있는지, 질문에 대한 답변을 제공합니다.
DotNet Programmer

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 문에 작성했던대로 그 코드의 4 선 경우에 실행됩니다 searchType == "SearchBooks".

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

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


1
여기에 C와 같은 스위치를 복제하는 방법이 있습니까? 하나의 스위치에서 일부 코드를 실행 한 다음 모든 사람에게 실행될 다른 코드로 넘어갑니다.
John Demetriou 2016 년

@JohnDemetriou go to case 문을 사용하여 동일한 내용을 복제 할 수 있습니다.
itsme.cvk

4

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

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

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

            }

4

다른 답변에서 언급되지 않았기 때문에 첫 번째 사례가 완료 된 직후 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;
}

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 Programmer

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.