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

本文关键字:执行 typeeloadeexception 简单 代码 编译 非常 | 更新日期: 2023-09-27 18:02:55

下面的代码可以在VS2013和VS2015中编译,适用于从2.0到4.6.1的各种。net框架版本,但是在执行时抛出一个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从一个结构体变为一个类,它将运行。我试图理解为什么这对两个结构体不起作用。为什么这段代码会失败?

异常消息为:

"系统。消息:系统类型的第一次异常。附加信息:无法加载类型"Test"。Bar ' 1'来自汇编'scratch, Version=1.0.0.0,文化=中性,PublicKeyToken=null'。"

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

不能创建带有循环类型的结构体

相似的问题:

struct Foo
{
  Bar bar;
}
struct Bar
{
  Foo foo;
}

struct Foo
{
  Foo foo1;
  Foo foo2;
}

类使用引用并且工作良好

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

你的struct Foo<T>建议在foo结构体中使用T-Type,但这会在结构体布局中产生循环

如果你真的使用t类型,它也会产生一个编译器错误:

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