2016-08-18 69 views
2

下面的代碼編譯在兩個VS2013和VS2015,各種版本的.NET Framework 2.0至4.6.1時引發一個TypeLoadException,但是當被執行時將引發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從結構更改爲類,它將運行。我試圖理解爲什麼這不適用於兩個結構。爲什麼這個代碼失敗?

異常消息是:

"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

的[在結構VS類使用泛型]可能的複製(HTTP://計算器.com/questions/13731798/generics-used-in-struct-vs-class) – MethodMan

+1

TypeLoadException的消息是什麼? –

+0

異常消息是:「發生了System.TypeLoadException異常 消息:mscorlib.dll中發生了類型'System.TypeLoadException'的第一次機會異常 其他信息:無法從程序集'scratch'加載類型'Test.Bar'1, Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null'。「 –

回答

1

你不能用環形類型

類似的問題創建結構:

struct Foo 
{ 
    Bar bar; 
} 

struct Bar 
{ 
    Foo foo; 
} 

struct Foo 
{ 
    Foo foo1; 
    Foo foo2; 
} 

類使用refe分配辦法和工作正常

通用邏輯有同樣的問題,但只在運行時(IL-編譯)

struct Foo<T>建議使用美孚,結構內部的T型生產類型的錯誤,但這種產品在結構佈局的循環

如果你真的使用T型,它也產生一個編譯器錯誤:

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

struct Bar<U> 
{ 
    Foo<Bar<U>> foo; // CS0523 
} 
相關問題