2016-08-18 3 views
2

다음 코드는 2.0에서 4.6.1 다양한 .NET 프레임 워크 버전, VS2013와 VS2015에서 모두 컴파일 실행 때 TypeLoadException이를 throw하지만 실행될 때 System.TypeLoadException 발생 :아주 간단한 코드 컴파일하지만

namespace Test 
{ 
    struct Foo<T> 
    { 
    } 

    struct Bar<U> 
    { 
     Foo<Bar<U>> foo; 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var x = new Bar<int>(); 
     } 
    } 
} 

그러나 Foo 또는 Bar 중 하나가 구조체에서 클래스로 변경되면 실행됩니다. 왜이 두 structs 작동하지 않는 이해하려고 노력하고있어. 이 코드가 실패하는 이유는 무엇입니까?

예외 메시지는 다음과 같습니다

"System.TypeLoadException occurred Message: A first chance exception of type 'System.TypeLoadException' occurred in mscorlib.dll Additional information: Could not load type 'Test.Bar`1' from assembly 'scratch, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'."

+1

가능한 복제 (HTTP : // 유래 .com/questions/13731798/generics-in-struct-vs-class) – MethodMan

+1

TypeLoadException 메시지는 무엇입니까? –

+0

예외 메시지 : "System.TypeLoadException이 발생했습니다. 메시지 : mscorlib.dll에서 'System.TypeLoadException'유형의 첫 번째 예외가 발생했습니다. 추가 정보 : 어셈블리 'scratch에서'Test.Bar'1 '유형을로드 할 수 없습니다. 버전 = 1.0.0.0, 문화 = 중립, PublicKeyToken = null '. " –

답변

1
당신이 루프 유형

비슷한 문제로 구조체를 만들 수 없습니다

:

struct Foo 
{ 
    Bar bar; 
} 

struct Bar 
{ 
    Foo foo; 
} 

또는

struct Foo 
{ 
    Foo foo1; 
    Foo foo2; 
} 

클래스는 REFE를 사용 rences 및

일반적인 로직 잘 작동이 같은 문제를 가지고 있지만 런타임 (IL-컴파일)

struct Foo<T>가 푸 - 구조체 내부의 T 타입을 사용하는 것이 제안의 형식 오류를 생산하지만 생산은 구조체 레이아웃 루프

당신이 정말로 T-Type을 사용하는 경우, 그것은 또한 컴파일러 오류가 발생합니다 :

struct Foo<T> 
{ 
    T demo; // CS0523 
} 

struct Bar<U> 
{ 
    Foo<Bar<U>> foo; // CS0523 
} 
[클래스 대 구조체에 사용되는 제네릭]의