code

"var"라는 클래스를 만들 수있는 이유는 무엇입니까?

codestyles 2020. 8. 15. 09:15
반응형

"var"라는 클래스를 만들 수있는 이유는 무엇입니까?


varC #의 키워드 가 아닌가요 ? 하지만 왜 이렇게 할 수 있습니까?

public class var { }

public class main
{
    public static void main(string[] args)
    {
        var testVar = new var();
    }
}

var코드에서 사용되는가이다 var전과 선언 클래스 main클래스입니다. 그리고 컴파일러는 불평조차하지 않습니다.

이 작업을 수행하는 동안 :

public class int { }

아니면 이거:

public class true { }

컴파일러는 intor true가 키워드이고 그렇게 사용할 수 없다고 말했습니다. 왜 같지 var않습니까?


var이 목록에 따른 키워드가 아닙니다 .

컨텍스트 키워드이므로 컨텍스트에서 컴파일러는 클래스와 컨텍스트 키워드를 결정할 수 있으며 혼동이 발생하지 않습니다.

문맥 키워드는 다음과 같습니다.

코드에서 특정 의미를 제공하는 데 사용되지만 C #에서는 예약어가 아닙니다.

예약되지 않았으므로 사용할 수 있습니다.

위의 의견에서 지적했듯이 Eric Lipperts 블로그 의 각 버전에 추가 된 다양한 키워드 및 문맥 키워드 목록뿐만 아니라 차이점에 대한 토론이 있습니다.

C # 1.0에서 키워드 세트가 결정 되었기 때문에 이전 버전과의 호환성을 유지하기 위해 추가 된 사항이 없다는 점이 흥미 롭습니다.


컴파일러는 var클래스 이름으로 사용 하는 컨텍스트가 키워드에 대한 컨텍스트가 아니므로이를 허용 한다는 것을 알 수있을만큼 똑똑 합니다 ( 컨텍스트 키워드 로 정의 된 이유입니다 ).


이것을 보는 또 다른 방법 : 키워드로서의 "var"는 C #의 첫 번째 버전에 없었으므로 ( "int"및 "true"와는 달리) "var"라는 클래스가있는 코드를 작성했을 수 있습니다. 이것은 완벽하고 합법적이었습니다. 나중에 "var"가 언어에 추가되었을 때 디자이너는 특정 컨텍스트에서만 키워드로 만들 정도로 친절했기 때문에 기존 var 클래스는 여전히 작동합니다.

이것은 언어 디자인의 진정한 과제 중 하나입니다. 기존 코드를 깨지 않고 새로운 기능을 사용하기 어렵게 만들지 않고 새로운 기능을 추가하는 방법입니다.


버전 3 이전의 C # 버전에서는 암시 적으로 형식화 된 지역 변수 가 아직 지원되지 않았기 때문에 var특별한 의미가 없었으며라는 이름의 변수와 클래스를 정의 할 수있었습니다 var. 예제 프로그램은 합법적입니다. varin 두 항목이 모두 main클래스 참조하기 때문 var입니다.

C # 3 이상 버전은 하위 버전과 호환되므로 버전 3 이전에 C #으로 작성된 코드는 여전히 새 컴파일러로 컴파일됩니다.

inttrueC # 1 이후 키워드입니다.


키워드는 문맥에 따라 예약 할 수 있습니다. 소스 코드가 구문 분석되면 해당 컨텍스트가 구문 분석 트리의 일부로 설정됩니다. 키워드 평가는 해당 컨텍스트 내에서 발생합니다. 따라서이 경우 var는 예약 된 컨텍스트에 있지 않으며 할당 문에서 사용할 때와 동일한 의미를 갖지 않습니다. 이 유연성에 대한 한 가지 이유는 var가 C # 3에 도입 되었기 때문에 모든 곳에서 예약하면 일부 프로그램에서 이전 버전과의 호환성이 깨졌을 수 있지만 변수 유형 선언으로 사용하면 이전 버전에서 컴파일되지 않았기 때문이라고 생각합니다. 파손.

참고 URL : https://stackoverflow.com/questions/10548988/why-can-i-create-a-class-named-var

반응형