非常简单的代码编译但在执行时抛出TypeLoadException

时间:2016-08-18 18:01:01

标签: c# .net generics clr

以下代码在VS2013和VS2015中编译,适用于从2.0到4.6.1的各种.NET Framework版本,但在执行时抛出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从结构更改为类,它就会运行。我试图理解为什么这对两个结构都不起作用。为什么这段代码失败了?

异常消息是:

  

&#34; System.TypeLoadException发生消息:类型&#39; System.TypeLoadException&#39;的第一次机会异常发生在mscorlib.dll中附加信息:无法加载类型&#39; Test.Bar`1&#39;来自assembly&#39; scratch,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null&#39;。&#34;

1 个答案:

答案 0 :(得分:1)

您无法使用循环类型

创建结构

类似的问题:

struct Foo
{
  Bar bar;
}

struct Bar
{
  Foo foo;
}

struct Foo
{
  Foo foo1;
  Foo foo2;
}

类使用引用并且工作正常

泛型逻辑具有相同的问题,但仅在运行时生成类型错误(IL-compile)

你的struct Foo<T>建议在Foo-struct中使用T-Type,但这会在struct layout中产生一个循环

如果你真的使用T-Type,它也会产生编译错误:

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

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