[CS0163] 한 case 레이블에서 다른 case 레이블로 제어를 이동할 수 없습니다.

컴파일 오류 CS0163switch 문에서 두 개 이상의 case 라벨이 있을 때, 각 섹션이 명시적으로 종료되지 않으면 발생합니다. 각 섹션을 종료하는 키워드는 다음과 같습니다~ 😉 return, goto, break, throw (키워드 중 하나로 종료해야 합니다.)

이러한 종료 문 없이 다음 case로 넘어가려고 할 때 CS0163 오류가 발생합니다.

오류의 원인

switch 문 내에서 case 또는 default 라벨에 도달한 후 명시적인 종료 없이 다음 섹션으로 넘어가는 것이 허용되지 않습니다. 이로 인해 프로그램 흐름이 예상치 못하게 이어질 수 있으므로, C# 컴파일러는 이를 오류로 간주합니다. 언어마다 이를 허용할지 여부에 대해 차이가 있는데요, C#은 오류로 설정해요! 😥

public class ClassBeomSang
{
    public static void Main()
    {
        int i = 0;

        switch (i)
        {
            case 1://[CS0163] 한 case 레이블에서 다른 case 레이블로 제어를 이동할 수 없습니다.
                i++;
            default:
                Console.WriteLine("Default");
                break;
        }
    }
}

해결 방법

case 섹션을 종료하는 명령문을 추가해야 합니다. 예를 들어 break, return, goto case, 또는 throw를 사용할 수 있습니다. 아래는 CS0163 오류를 해결한 예제입니다.

public class ClassBeomSang  
{  
    public static void Main()  
    {  
        int i = 0;  
  
        switch (i)   
        {  
            case 1:  
                i++;
                break; // 정상 : 섹션을 종료하는 break 추가
  
            case 2:  
                i++;  
                return; // 정상 : return으로 섹션 종료
  
            case 3:  
                i = 0;  
                return; // 정상 : return으로 섹션 종료
  
            default:  
                Console.WriteLine("Default");
                break; // 정상 : 섹션을 종료하는 break 추가
        }  
    }  
}

위 코드에서는 각 casedefault 섹션에 break 또는 return 명령문을 추가하여 CS0163 오류를 해결했습니다.

fall-through 동작을 구현하고 싶다면, goto case #를 사용하면 됩니다. 예를 들어 case 1에서 case 3으로 흐름을 넘기려면 다음과 같이 작성합니다.

case 1:
    i++;
    goto case 3;

이렇게 하면 case 3으로 직접 이동하며, 오류 없이 fall-through를 구현할 수 있습니다. 😉

public class ClassBeomSang
{
    public static void Main()
    {
        int i = 0;

        switch (i)
        {
            case 1:
                i++;
                goto case 3; // 정상 : 섹션3로 이동                        

            case 2:
                i++;
                return; // 정상 : return으로 섹션 종료

            case 3:
                i = 0;
                return; // 정상 : return으로 섹션 종료

            default:
                Console.WriteLine("Default");
                break; // 정상 : 섹션을 종료하는 break 추가
        }
    }
}
댓글 쓰기
가져가실 때, 출처 표시 부탁드려요! 감사합니다. 💗