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

标签 c# generics struct language-lawyer

这个问题在这里已经有了答案:





Self referencing generic member in struct

(1 个回答)


去年关闭。




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

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 上运行此代码。

最佳答案

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

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

关于c# - 为什么具有带有类型参数 P 的泛型结构字段的结构 P 会导致 TypeLoadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59965631/

相关文章:

c# - OPC-UaFx采样速度极慢

ios - Swift func with generic where constraint is a protocol which self conforms

generics - 返回保守的 impl 特征时,生命周期意味着什么?

c - C 中的嵌套结构和取消引用指针

c++ - 如何确定是否将某些内容添加到结构中?

c# - .Net 中有 ZonedDateTime (Java) 吗?

c# - 使用 WMI 识别哪个设备导致了 Win32_DeviceChangeEvent

c# - 更新语句不更新我的数据

c# - 当两个方法在替换类型参数后具有相同的签名时,错误的重载将被覆盖

c - 将递归 C 结构移植到 Fortran