对于从2.0到4.6.1的各种.NET Framework版本,以下代码在VS2013和VS2015中均进行编译,但是在执行时会引发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消息:mscorlib.dll中发生了类型'System.TypeLoadException'的第一次机会异常。其他信息:无法从程序集'scratch,Version = 1.0.0.0,Culture =中加载类型'Test.Bar`1'。中性,PublicKeyToken =空”。

最佳答案

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

类似的问题:

struct Foo
{
  Bar bar;
}

struct Bar
{
  Foo foo;
}


要么

struct Foo
{
  Foo foo1;
  Foo foo2;
}


类使用引用并且工作正常

通用逻辑具有相同的问题,但仅在运行时会产生类型错误(IL编译)

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

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

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

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

关于c# - 非常简单的代码可以编译,但是在执行时会引发TypeLoadException,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39024740/

10-10 17:02