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

时间:2015-04-07 15:17:50

标签: c# struct mono

示例:

struct Id<T> {
  int id;
}

struct Thing {
  public Id<Thing> id;
}

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

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

1 个答案:

答案 0 :(得分:1)

正如评论中所讨论的,虽然此代码使用MS C#编译器进行编译,但它实际上并未执行 - 它在运行时提供TypeLoadException。请注意,当两者类型为struct时,会出现问题。所以问题是,这是C#编译器还是运行时的问题?

由于运行时也包含在自己的规范中,因此我查看了所有甚至与之相关的CLI规范部分,并且我没有发现任何会禁止此操作的内容。不在IL定义中(显然,因为IL被认为是有效的),而不是在运行时元数据结构中。

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

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

可悲的是,这意味着你不能使用你那种方便的结构。确保其中一种类型为class,或者您只需要为您的IdOfSomething中的每一种生成不同的类型。很高兴Mono C#编译器在你在运行时发现之前告诉过你:P