2016-08-18 19 views
2

を実行する場合、次のコードは、2.0から4.6.1までの様々な.NET Frameworkのバージョンのために、VS2013とVS2015の両方でコンパイルが、実行されたときに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>(); 
     } 
    } 
} 

しかしフーやバーのいずれかがクラスに構造体から変更された場合、それが実行されます。私はなぜこれが2つの構造体のために動作しないのか理解しようとしています。なぜこのコードは失敗しますか?

例外メッセージは、次のとおりです。

struct Foo 
{ 
    Bar bar; 
} 

struct Bar 
{ 
    Foo foo; 
} 

または

struct Foo 
{ 
    Foo foo1; 
    Foo foo2; 
} 

クラスがREFEを使用する:あなたは、ループ型と構造体

同様の問題を作成することはできません

"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/questions/13731798/generics-in-struct-vs-class) – MethodMan

+1

TypeLoadExceptionのメッセージは何ですか? 「System.TypeLoadExceptionが メッセージが発生しました:: –

+0

例外メッセージがあるタイプ 『System.TypeLoadException』の最初のチャンス例外ががmscorlib.dllで発生した 追加情報:アセンブリ「スクラッチから型 『Test.Bar'1』をロードできませんでした、バージョン= 1.0.0.0、Culture =ニュートラル、PublicKeyToken = null '。 " –

答えて

1

rencesと

汎用ロジック正常に動作しますが、同じ問題を抱えているが、唯一のランタイム(IL-コンパイル)

は、あなたのstruct Foo<T>がfoo-構造体の内側T-タイプを使用することを示唆している時に、型エラーが発生するが、この生産は構造体のレイアウトでループ

あなたが本当にT-タイプを使用する場合、それはまた、コンパイラ・エラーが生成:

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

struct Bar<U> 
{ 
    Foo<Bar<U>> foo; // CS0523 
} 
[クラス対構造体に使用されるジェネリック]の
関連する問題