UFO ET IT

Int32가 int의 별칭 인 경우 Int32 클래스는 어떻게 int를 사용할 수 있습니까?

ufoet 2020. 12. 31. 22:43
반응형

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가 사용되지 않기 때문에 문제를 일으킬 수있는 것은 아닙니다.) 이 가정이 맞다면이 트릭은 특수 컴파일러 유형에서만 작동합니다.

더 읽어 보면, 구조체가 실제 객체가 아니라 단순히 메타 데이터라는 것을 알 수 있습니다. 따라서 동일한 재귀 정의 제한에 구속되지 않습니다.

참조 URL : https://stackoverflow.com/questions/16113850/if-int32-is-just-an-alias-for-int-how-can-the-int32-class-use-an-int

반응형