c# - 为什么具有带有类型参数 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 上运行此代码。
解决方案
这是设计使然的 CLR 问题。为了加载 struct Person
CLR 需要加载它的所有成员。因此,当 CLR 尝试加载时GuidFor<Person> Id
,它需要先加载Person
。我们有一个循环。
CLR 理解这一点并抛出异常。
推荐阅读
- html - 将输入文本字段中的文本稍微向右对齐
- android - 使用 SQLiteAssetHelper 首次加载时应用程序崩溃
- r - foreach,dopar 写入相同的 data.table
- go - 在 sync.Map 中是否有必要使用 Load 后跟 LoadOrStore 来处理复杂值
- css - 角度:在editText的滚动面板中跳跃滚动条
- node.js - 为什么我的徽标没有显示 nodejs 应用程序
- scala - Spark Streaming:使用带有列修剪的 MicroBatchReader 的模式不匹配
- algorithm - 卷积网络中的最佳过滤器数量
- basex - BaseX XQuery 很慢(再次!)
- dart - firebase 通知消息在导航到页面之前没有关闭?