왜 ;; 지역 변수 선언 후에는 허용되지만 필드 선언 후에는 허용되지 않습니까?
나는이 이상한 행동을 보았고 이것에 대한 합리적인 설명이 있는지 궁금합니다.
실수로 함수의 지역 변수에 추가 / 추가 세미콜론을 넣었을 때 :
public void MyMethod ()
{
int a = 1;;
Console.WriteLine(a); //dummy
}
컴파일을하지만 중복됨을 보여줍니다.
그러나 필드로 (우연히) 그렇게했을 때 오류가 발생했습니다 (컴파일).
질문
필드에서 이러한 제한에 대한 이유가 있습니까?
Nb 나는 이미 var
필드에서 허용하지 않는 다른 제한 사항을 알고 있습니다. 그러나 여기에는 다른 것이 있습니다.
;
단독으로 문 (빈 문)이지만 클래스 본문에는 선언 문만 허용됩니다. 다른 종류의 문은 메서드 본문에만 나타날 수 있습니다.
;
그 자체는 빈 진술입니다. 그리고 클래스 범위에서는 선언문 만 허용됩니다.C# Specification 5.0, §10.1.6 Class Body
class-body:
{ class-member-declarations }
예를 들어 별도의 문에서 필드를 초기화 할 수 없습니다.
class Foo
{
int x = 2; // this is allowed
x = 5; // this is not
}
따라서 필드와 다른 멤버 만 선언 할 수 있지만 클래스 본문에서 다른 문을 사용할 수 없습니다.
그것은 지역 변수 선언의 일부가 아니며 Thomas가 지적한 것처럼 그 자체로 진술입니다.
이것은 유효합니다 :
public void MyMethod ()
{
;;;
int a = 1;
;
Console.WriteLine(a); //dummy
;;
}
세미콜론 명령문의 아이디어는 다음과 같은 구성을 허용하는 것입니다.
while(mycondition) ;
클래스 본문에 허용하는 것은 의미가 없으며 추가 가치를 제공하지 않습니다.
TLDR; 이것은 변수 / 필드 선언과 관련이 없습니다.
이 스레드도 살펴볼 수 있습니다. C #에서 문없이 범위를 언제 사용합니까?
비슷하지만 완전하지는 않습니다. 이유를 이해하는 데 도움이됩니다.
int a = 1;;;
유효합니다.
첫 번째 경우 컴파일러는 no-op 문을 봅니다. 두 번째 ;
가 변수 선언 뒤에 오는 것은 중요하지 않습니다 .
두 번째 경우 컴파일러는 허용되지 않는 빈 선언을 생성하려는 시도를 확인합니다.
함수 본문 내부에 중복; 빈 문이지만 클래스 선언에 선언되지 않은 필드가 있으며 허용되지 않습니다.
'Programing' 카테고리의 다른 글
Caret 패키지를 사용하지만 라이브러리에서 오류가 발생 함 (e1071) (0) | 2020.12.08 |
---|---|
Gmail 및 Python을 사용하여 메일을 보낼 때 SMTPAuthenticationError (0) | 2020.12.08 |
Watchkit 확장-일치하는 프로비저닝 프로파일이 없습니다. (0) | 2020.12.08 |
django.db.utils.ProgrammingError : 관계가 이미 있습니다. (0) | 2020.12.08 |
curl을 통해 PHP에서 헤더 만 검색 (0) | 2020.12.08 |