为什么我在 C# 中得到一个带有幻影类型的 "cycle in the struct layout"?

why do i get a "cycle in the struct layout" with phantom types in c#?

示例:

struct Id<T> {
  int id;
}

struct Thing {
  public Id<Thing> id;
}

这会导致循环结构布局,但我没有看到循环。如果 Id 有一个类型为 T 的字段,sizeof 将是未定义的,但它没有。

这是单声道错误还是规范的一部分?

正如评论中所讨论的,虽然这段代码使用 MS C# 编译器编译,但实际上并没有执行——它在运行时给出了 TypeLoadException。请注意,当 both 类型为 struct 时,会出现 only 问题。那么问题来了,这是C#编译器的问题还是运行时的问题?

由于运行时也包含在它自己的规范中,所以我仔细阅读了 CLI 规范中所有模糊相关的部分,但没有发现任何内容会禁止这样做。不在 IL 定义中(显然,因为 IL 被认为是有效的),也不在运行时元数据结构中。

鉴于此,我更赞成调用运行时实现有缺陷。我怀疑当 Mono 团队遇到这个问题时,他们考虑为这种情况添加一个编译器错误是较小的邪恶。或者他们可能只是错误地评估了循环 struct 约束:)

甚至有可能它没有在运行时崩溃,使C#编译器更加正确。我当然无法验证这一点:)

遗憾的是,这意味着您不能使用您的那个方便的构造。要么确保其中一种类型是 class,要么您只需要为每个 IdOfSomething 制作不同的类型。很高兴 Mono C# 编译器在您在运行时发现之前就告诉您了 :P