컴파일 오류 CS0163는 switch 문에서 두 개 이상의 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 추가
}
}
}
위 코드에서는 각 case와 default 섹션에 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 추가
}
}
}
