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
안에서 선언됩니다 . 그러나 명령문 내부에서 바로 유효하지 않습니다. 유효한 명령문은 및 입니다.case
break
switch
case
default
또한 const
선언은 컴파일 타임에 평가 되므로 이전 x
에 break
문 이 있어도 정의됩니다 .
그러나 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:
...
그것이 허용된다면, 당신은 거기에서 모든 프로그래밍을 기꺼이 할 사람들을 찾을 것입니다 :-)
'Development Tip' 카테고리의 다른 글
기본값이있는 옵션에 대한 자바 스크립트 디자인 패턴? (0) | 2020.11.20 |
---|---|
TSV 파일을 읽고 구문 분석 한 다음 CSV로 저장하기 위해 조작 (* 효율적으로 *) (0) | 2020.11.20 |
EC2에서 인스턴스를 삭제하는 방법은 무엇입니까? (0) | 2020.11.20 |
Docker 명령 실패 (Windows) (0) | 2020.11.20 |
php.ini & SMTP =-사용자 이름과 비밀번호를 어떻게 전달합니까? (0) | 2020.11.20 |