为什么我在 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
示例:
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