对于从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/