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

时间:2020-01-29 11:00:17

标签: c# generics struct language-lawyer

以下代码编译时没有警告或错误,但会导致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上运行此代码。

1 个答案:

答案 0 :(得分:0)

这是设计上的CLR问题。为了加载结构Person,CLR需要加载其所有成员。因此,当CLR尝试加载GuidFor<Person> Id时,它需要首先加载Person。而且我们有一个周期。

CLR理解了这一点并引发异常。