首页 > 解决方案 > 为什么具有带有类型参数 P 的通用结构字段的结构 P 会导致 TypeLoadException

问题描述

以下代码编译时没有警告或错误,但会导致TypeLoadException异常:

public struct GuidFor<T>
{
}

public struct Person
{
    public GuidFor<Person> Id;
}

class Program
{
    static void Main()
    {
        Person p;
    }
}

Person是一个结构并且具有一个通用结构并Person用作其类型参数的字段时,就会出现问题。

为什么这种模式会导致运行时错误?如果不允许这样做,我希望它是编译时错误而不是运行时错误。C++ 中的等效代码可以正常工作并且通常很有用。

我在 Windows 10、.NET Core 3.0.100 上运行此代码。

标签: c#genericsstructlanguage-lawyer

解决方案


这是设计使然的 CLR 问题。为了加载 struct PersonCLR 需要加载它的所有成员。因此,当 CLR 尝试加载时GuidFor<Person> Id,它需要先加载Person。我们有一个循环。

CLR 理解这一点并抛出异常。


推荐阅读