非常简单的代码编译,但在执行时抛出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'。"
不能创建带有循环类型的结构体
相似的问题:
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
}