Programing

왜 ;;

lottogame 2020. 12. 8. 07:37
반응형

왜 ;; 지역 변수 선언 후에는 허용되지만 필드 선언 후에는 허용되지 않습니까?


나는이 이상한 행동을 보았고 이것에 대한 합리적인 설명이 있는지 궁금합니다.

실수로 함수의 지역 변수에 추가 / 추가 세미콜론을 넣었을 때 :

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 문을 봅니다. 두 번째 ;가 변수 선언 뒤에 오는 것은 중요하지 않습니다 .

두 번째 경우 컴파일러는 허용되지 않는 빈 선언을 생성하려는 시도를 확인합니다.


함수 본문 내부에 중복; 빈 문이지만 클래스 선언에 선언되지 않은 필드가 있으며 허용되지 않습니다.

참고 URL : https://stackoverflow.com/questions/27601807/why-is-allowed-after-a-local-variable-declaration-but-not-after-a-field-decl

반응형