데브허브 | DEVHUB | The Code That Compiles But Always Crashes #csharp #dotnet #coding
컴파일러는 승인하지만 .NET 런타임은 반드시 거부하는 C# 코드를 작성할 수 있다는 사실을 알고 계셨나요? 이 고급 문제는 자체 참조하는 일반 구조체와 관련이 있습니다. GenericStruct와 같은 일반 구조체를 만들고 public static T DefaultValue와 같은 자체 형식의 정적 필드를 지정하면 런타임에서 해결할 수 없는 순환 종속성이 생성됩니다.
컴파일러는 오류 없이 프로젝트를 빌드합니다. 하지만 실행 중인 애플리케이션에서 해당 형식에 액세스하려고 하는 순간 System.TypeLoadException이 발생하며 충돌이 발생합니다. 런타임은 메모리에 형식을 배치하는 방법을 알아내지 못합니다. 해결 방법은 순환 참조를 해제하는 것입니다. 정적 필드를 중첩된 도우미 클래스로 이동하면 됩니다. 이는 C# 컴파일러에도 맹점이 있으며, 가장 심각한 버그 중 일부는 코드를 배포한 후에야 나타난다는 것을 보여주는 드물지만 강력한 사례입니다.