为什么具有带有类型参数 P 的泛型结构字段的结构 P 会导致 TypeLoadException

Dex*_* CD 6 c# generics struct language-lawyer

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

public struct GuidFor<T>
{
}

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

class Program
{
    static void Main()
    {
        Person p;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

Kri*_*riy 0

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

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