Development Tip

C #은 왜 케이스 뒤에 문을 허용하지만 그 전에는 허용하지 않습니까?

yourdevel 2020. 11. 20. 09:44
반응형

C #은 왜 케이스 뒤에 문을 허용하지만 그 전에는 허용하지 않습니까?


왜 C #을 허용하지 않습니다 :

var s = "Nice";
switch (s)
{
    case "HI":
        break;
    const string x = "Nice";
    case x:
        Console.Write("Y");
        break;
}

그러나 이것은 아닙니다 .

var s = "Nice";
switch (s)
{
    const string x = "Nice";
    case x:
        Console.Write("Y");
        break;
}

들여 쓰기가 오해의 소지가 있기 때문에 첫 번째 코드는 실제로 다음과 같습니다.

var s = "Nice";
switch (s)
{
    case "HI":
        break;
        const string x = "Nice";
    case x:
        Console.Write("Y");
        break;
}

즉, 유효한 x안에서 선언됩니다 . 그러나 명령문 내부에서 바로 유효하지 않습니다. 유효한 명령문은 입니다.casebreakswitchcasedefault

또한 const선언은 컴파일 타임에 평가 되므로 이전 xbreak이 있어도 정의됩니다 .

그러나 Mono C # 컴파일러 이 코드를 컴파일x 하지 않고 “ ' ' 라는 이름 이 현재 범위에 존재하지 않는다 ”고 불평 하므로 Mono는 .NET 컴파일러보다 더 많은 검사를 구현하는 것으로 보입니다. 그러나 C # 표준에서 이러한 const선언 사용을 금지하는 규칙을 찾을 수 없으므로 .NET 컴파일러가 옳고 Mono 컴파일러가 잘못되었다고 가정합니다.


언어 사양은 스위치에서 직접 const를 허용하지 않기 때문에 (대소 문자 및 기본값 만 허용됨) :

switch (expression)
{
   case constant-expression:
      statement
      jump-statement
   [default:
      statement
      jump-statement]
}

어디:

expression:정수 또는 문자열 유형 표현식입니다.
statement:제어가 케이스 또는 기본값으로 전송되는 경우 실행될 삽입 된 명령문입니다.
jump-statement:제어권을 케이스 본문 외부로 전송하는 점프 문입니다.
constant-expression:이 표현식의 값에 따라 특정 케이스로 제어가 전달됩니다.

첫 번째 경우 const는 케이스 로직의 일부입니다. const는 런타임이 아닌 컴파일 타임에 다시 작성되기 때문에 작동합니다.


... 때문에 switch이 작업을 수행

jump_to_the_label_matchig(s)
{
   label1:
      ...
      done_quit_this;
   label2:
      ...
      done_quit_this;
   d'oh:
      ...
      done_quit_this;
}

이건 아니야

now_jump_to_the_label_matchig(s)
{

   le'mme_wander_around_doing_things_that_could_have_been_done_before_me;

   label1:
      ...
      done_quit_this;
   label2:
      ...

그것이 허용된다면, 당신은 거기에서 모든 프로그래밍을 기꺼이 할 사람들을 찾을 것입니다 :-)

참고 URL : https://stackoverflow.com/questions/16694189/why-does-c-sharp-allow-statements-after-a-case-but-not-before-it

반응형