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


103

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않습니까?


6
왜 그렇게 하시겠습니까? 너무 혼란스럽고 읽기 어렵습니다.
duffymo


31
좋은 질문입니다!
Richard

50
var var = "var";방법으로 도 할 수 있습니다 . 결국 금요일입니다.
Henk Holterman

11
나는 그들이 "var"가 특별한 것을 의미 하기 전에 코드 생성과 역 호환이되도록 만들었다 고 생각한다 .
vidstige

답변:


101

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

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

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

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

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

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

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


1
그러나 여기에 "C # 키워드"로 분류되어 있습니다. msdn.microsoft.com/en-us/library/bb383973.aspx ... 혼란 스럽습니다!
Richard

4
그러나 그것은 Contextual Keyword. "컨텍스트 키워드는 코드에서 특정 의미를 제공하는 데 사용되지만 C #에서는 예약어가 아닙니다 . partial 및 where와 같은 일부 컨텍스트 키워드는 두 개 이상의 컨텍스트에서 특별한 의미를 갖습니다."
Tim Schmelter

5
@TimSchmelter 그러면 "var"는 "키워드"입니다. "예약 된 단어"가 아니죠?
luiscubal

2
나는 그것이 이전 코드와의 호환성을 유지하는 것이라고 생각하고 있습니다. 누군가 클래스 var가 있으면 C #을 업그레이드 할 때 모든 것이 중단되지는 않습니다.
Callum Rogers

1
@CallumRogers : 그건 정확하게 는 C # 팀이 왜 그랬는지. from, join 등과 같이 나중에 소개 된 다른 "키워드"도 마찬가지입니다 (모두 상황에 따라 다름).
Abel

18

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


이 대답은 적어도 다소 오해의 소지가 있다고 생각합니다. 컴파일러는 .NET var과 같은 코드에서 키워드로 사용 되는지 여부를 확인할만큼 정확히 "스마트"하지는 않습니다 var testVar = new var();. 예, 이름 var이 지정된 사용자 지정 유형 이 정의 되었는지 여부와 관련하여 컨텍스트 가 적용되지만 컴파일러가 클래스를 참조 하는지 아니면 클래스 를 기본으로하는 키워드 를 참조 하는지 알기에 컴파일러가 충분히 똑똑 하지 않기 때문입니다. 그런 맥락에서. 있었 키워드, 그것은 바로 그 "상황"에 사용될 수있는 다른 이름. var testVarvarvarvar
OR Mapper

명암과 같은 다른 문맥 키워드와 것을 add- 여기, 컴파일러는 실제로 키워드가 의미 여부를 모든 경우에 알고 (이벤트 선언, 식별자는 어떤 의미가하지 것), 또는 코드 식별자를 참조되는지 여부 (유형이나 선언의 이름, 메서드 본문 내에서 식별자 사용; 키워드는 의미가 없습니다.)
OR Mapper

12

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

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


8

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

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

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


3

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.