Int32가 int의 별칭 인 경우 Int32 클래스는 어떻게 int를 사용할 수 있습니까?
재미를 위해 .NET Framework Reference Source 의 .NET 소스 코드를 탐색 했습니다. 그리고 내가 이해하지 못하는 것을 발견했습니다.
유형에 대한 C # 코드 가있는 Int32.cs 파일 이 있습니다 Int32
. 그리고 그것은 나에게 이상하게 보입니다. C # 컴파일러는 Int32
유형에 대한 코드를 어떻게 컴파일 합니까?
public struct Int32: IComparable, IFormattable, IConvertible {
internal int m_value;
// ...
}
그러나 이것은 C #에서 불법이 아닙니까? 경우 int
만입니다 별칭 Int32
, 그것은 함께 컴파일 실패 오류 CS0523 :
'struct1'유형의 구조 멤버 'struct2 field'는 구조 레이아웃에서 순환을 발생시킵니다.
컴파일러에 마술이 있습니까, 아니면 완전히 벗어 났습니까?
이것은 C #에서 불법이 아닙니까? "int"가 "Int32"의 별칭 일 경우 CS0523 오류와 함께 컴파일에 실패해야합니다. 컴파일러에 마법이 있습니까?
예; 오류는 컴파일러에서 의도적으로 억제됩니다. 해당 유형이 기본 제공 유형 인 경우주기 검사기는 완전히 건너 뜁니다.
일반적으로 이런 종류의 것은 불법입니다.
struct S { S s; int i; }
이 경우 S의 크기는 정의되지 않습니다. S의 크기가 무엇이든 상관없이 자체에 int의 크기를 더한 값과 같아야하기 때문입니다. 그런 크기는 없습니다.
struct S { S s; }
이 경우 S의 크기를 추론 할 정보가 없습니다.
struct Int32 { Int32 i; }
그러나이 경우 컴파일러는 System.Int32
매우 특별한 유형이기 때문에 4 바이트 를 미리 알고 있습니다.
덧붙여서, C # 컴파일러 (및 CLR)가 구조체 유형 집합이 순환되는시기를 결정하는 방법에 대한 세부 정보는 매우 흥미 롭습니다. 언젠가는 그것에 대한 블로그 기사를 작성하려고 노력할 것입니다.
int
의 별칭 Int32
이지만 Int32
보고 있는 구조체는 단순히 메타 데이터이며 실제 개체가 아닙니다. int m_value
가 실제로 다른 곳에서 참조하지 않기 때문에 선언은 (이있을 수 있습니다 이유입니다) 만 구조체에 적절한 크기를 줄 가능성이있다.
즉, 컴파일러는 문제를 방지합니다. MSDN 포럼에 주제 에 대한 토론이 있습니다.
토론에서 선언이 어떻게 가능한지 결정하는 데 도움이되는 선택한 답변의 인용문이 있습니다.
유형에 정수 m_value 필드가 포함되어있는 것은 사실이지만 필드는 참조되지 않습니다. 모든 지원 방법 (CompareTo, ToString 등)에서 대신 "this"가 사용됩니다. m_value 필드는 구조가 적절한 크기를 갖도록 강제하기 위해서만 존재할 수 있습니다.
컴파일러가 "int"를 볼 때 "mscorlib.dll의 System.Int32에 대한 참조, 나중에 해결 될 것"으로 변환하고 mscorlib.dll을 빌드하기 때문에 순환 참조 ( 그러나 m_value가 사용되지 않기 때문에 문제를 일으킬 수있는 것은 아닙니다.) 이 가정이 맞다면이 트릭은 특수 컴파일러 유형에서만 작동합니다.
더 읽어 보면, 구조체가 실제 객체가 아니라 단순히 메타 데이터라는 것을 알 수 있습니다. 따라서 동일한 재귀 정의 제한에 구속되지 않습니다.
'UFO ET IT' 카테고리의 다른 글
Jenkins에 사용자 이름과 비밀번호를 추가하려면 어떻게해야합니까? (0) | 2020.12.31 |
---|---|
seq가 나쁜 이유는 무엇입니까? (0) | 2020.12.31 |
ASP.NET Core와 관련된 ConfigureAwait (false)? (0) | 2020.12.31 |
추적 번호에 대한 정규식 패턴 (0) | 2020.12.31 |
C 컴파일러는 어떻게 C로 작성할 수 있습니까? (0) | 2020.12.31 |