为什么我在c#中使用幻像类型获得"结构布局中的循环"?

not*_*ama 6 c# mono struct

例:

struct Id<T> {
  int id;
}

struct Thing {
  public Id<Thing> id;
}
Run Code Online (Sandbox Code Playgroud)

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

这是一个单声道的bug,还是规范的一部分?

Lua*_*aan 1

正如评论中所讨论的,虽然此代码使用 MS C# 编译器进行编译,但它实际上并不执行 - 它给出了TypeLoadException运行时。请注意,仅当两种类型均为时才会出现该问题struct。那么问题来了,这是C#编译器的问题还是运行时的问题?

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

鉴于此,我更倾向于称运行时实现有缺陷。我怀疑,当 Mono 团队面临这个问题时,他们考虑添加一个编译器错误,这样的情况是两害相权取其轻。或者也许他们只是错误地评估了循环struct约束:)

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

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