2013-07-05 2 views
2

저는 여유 시간에 대화 형 컴파일러에서 작업 중이며 같은 이름의 두 필드를 정의하는 TypeBuilder을 사용하여 유형을 정의 할 수 있음이 밝혀졌습니다. 이 정적 필드가 초기화 된 초기화 프로그램을 실행합니다. 내 시계 창을 참조하십시오 : 같은 이름의 두 개의 필드와 유형이 실제 어떤 목적을 가질 수있다 :이 이상한 찾을TypeBuilder는 동일한 이름의 두 필드를 정의 할 수 있습니다.

enter image description here

? 이것은 실제로 CLR 사양 (참조에 관심이있을 것입니다)에 따라 "합법적입니까?"아니면 TypeBuilder이 허용하지 않은 불법적 인 동작입니까?

+0

서로 다른 두 필드에 동일한 이름을 사용하는 실제적인 이유는 코드 난독 화입니다. – rpgmaker

+0

나는 메타 데이터 시스템에 의해 클래스가로드되는 순간에 던질 것으로 기대한다. 그렇지 않다면 아마 합법적 일 것입니다. 어쨌든, CLR은 이름이 아닌 필드/메서드/속성을 식별하기 위해 핸들을 사용한다고 가정합니다. 따라서 모든 것이 생성되고 멤버를 수정하기 위해 핸들이나 오프셋을 사용하는 한 괜찮습니다. 그러나 DLR과 같은 이름으로 뭔가를 참조하면 AmbiguousMatch가 표시됩니다. – quetzalcoatl

+1

나는 [이 social.msdn 스레드]를 우연히 발견했습니다. (http://social.msdn.microsoft.com/Forums/vstudio/en-US/ed1a92bc-da1e-4a75-a12a-05c6b205ca25/reflection-with-typebuilder- add-duplicate-field-in-a-type) 여기서 이것이 TypeBuilder의 '의도적으로'이며 '당신이 그것을 돌봐야 만합니다'라고 명시되어 있습니다. CLR 계층에서 불법이라는 언급은 아직 없습니다. – quetzalcoatl

답변

4

이는 ECMA-335 CLI specification의 §I.8.5.2에 설명되어 있습니다 :

Generally, names are not unique. Names are collected into groupings called scopes. Within a scope, a name can refer to multiple entities as long as they are of different kinds (methods, fields, nested types, properties, and events) or have different signatures.

CLS Rule 5: All names introduced in a CLS-compliant scope shall be distinct independent of kind, except where the names are identical and resolved via overloading. That is, while the CTS allows a single type to use the same name for a method and a field, the CLS does not.

나는 이것을 이해하는 방법, 당신이 동일한 유형의 같은 이름을 가진 두 개의 서로 다른 필드를 가지고 있지만, 할 수 있다는 것을 의미 다른 서명, 즉 다른 유형을 가져야합니다. 따라서 두 개의 필드가 string xint x 인 경우 CLI 사양에 따라 괜찮습니다. CLS (Common Language Specification)에 따르면 괜찮지는 않지만 기본적으로 언어 상호 운용성을 향상시키는 일련의 규칙입니다. 한편

는 같은 이름과 유형을 가진 두 개의 필드와 유형은 불법이며 그런 유형 어셈블리에 PEVerify를 실행하는 경우, 그것은 참으로 검증 실패의 경우

[MD]: Error: Field has a duplicate, token=0x04000002. [token:0x04000001]
[MD]: Error: Field has a duplicate, token=0x04000001. [token:0x04000002]

을 어떤 이유로 CLR이이 검사를하지 않는 것 같아서 잘못된 유형을 허용합니다. C# 컴파일러는 이러한 유형을 처리 할 수도 있습니다. 두 필드 중 하나를 선택하여 사용하는 것 같습니다.

관련 문제