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

C# 非常简单的代码编译,但在执行时抛出TypeLoadException,c#,.net,generics,clr,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 { sta

以下代码在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
{
}
结构条
{
富富,;
}
班级计划
{
静态void Main(字符串[]参数)
{
var x=新条();
}
}
}
但是,如果Foo或Bar从结构更改为类,它将运行。我试图理解为什么这对两个结构不起作用。为什么这个代码会失败

例外消息是:

“System.TypeLoadException发生消息:在mscorlib.dll中发生了类型为”“System.TypeLoadException”“的首次意外异常附加信息:无法从程序集”“scratch,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”“加载类型为”“Test.Bar`1”“。”


不能使用循环类型创建结构

类似问题:

struct Foo
{
  Bar bar;
}

struct Bar
{
  Foo foo;
}

类使用引用,工作正常

泛型逻辑也有同样的问题,但只在运行时产生类型错误(IL编译)

您的
structfoo
建议在Foo结构内部使用T-Type,但这会在结构布局中产生一个循环

如果您真的使用T-Type,它还会产生一个编译器错误:

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

struct Bar<U>
{
  Foo<Bar<U>> foo; // CS0523
}
structfoo
{
T demo;//CS0523
}
结构条
{
Foo-Foo;//CS0523
}

TypeLoadException的消息可能重复?异常消息为:“System.TypeLoadException发生消息:mscorlib.dll中发生了类型为”“System.TypeLoadException”“的首次意外异常其他信息:无法从程序集”“scratch,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null”“加载类型为”“Test.Bar`1”“。”。“可能与……有关?当我改变
Foo-Foo时,我得到了CS0523
条形图CS0523很好的解释是(这或多或少是重复的,但不准确)
struct Foo<T>
{
  T demo; // CS0523
}

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