2016-08-18 1 views
2

Следующий код компилируется как в VS2013 и VS2015, для различных версий .NET Framework от 2.0 до 4.6.1, но при выполнении бросает System.TypeLoadException:Очень простой код компилируется, но выбрасывает 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 изменены из структуры в класс, она запускается. Я пытаюсь понять, почему это не работает для двух структур. Почему этот код не работает?

Сообщение Исключение:

"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: // StackOverflow .com/вопросы/13731798/generics-used-in-struct-vs-class) – MethodMan

+1

Что такое сообщение TypeLoadException? –

+0

Сообщение об исключении: «Возникло событие System.TypeLoadException Сообщение: Первое исключение исключения типа« System.TypeLoadException »произошло в mscorlib.dll Дополнительная информация: Не удалось загрузить тип« 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-Type внутри Foo-структуры, но это продукция петля в макете STRUCT

если вы действительно использовать T-Type, он производит также компилятор-ошибку:

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

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