以下代码在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;
答案 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
}