【发布时间】:2018-05-06 16:36:56
【问题描述】:
public struct MyStruct {
static MyStruct? myProperty;
}
尝试编译它会给我错误:Struct member 'myStruct.myProperty' causes a cycle in the struct layout。
根据我收集的信息,当结构的 instance 包含其自己的结构作为属性时,通常会发生此错误(这对我来说很有意义)。
但在这里,它是关于 static 属性的,所以我看不出这种递归是如何发生的。另外,该错误仅在声明 Nullable 结构时发生,声明静态不可为 null 是安全的。
究竟发生了什么会导致循环?
编辑:
我确实找到了我应该重复的问题;它解释了为什么当 Instance 具有自己类型的成员时会发生递归,但这里是关于静态成员的。
我从经验中知道 struct 可以有自己类型的 static 成员,在运行时不会中断,这个特定的代码似乎只是因为静态成员是 Nullable 才中断的。
其次,很多人马上告诉我代码是为他们编译的;似曾相识,我正在使用的 c# 的“版本”是针对 Unity 的,所以我认为这是他们的编译器的另一个错误,我会向他们提出这个问题。
@Evk 指出这实际上是一个常见问题:
https://github.com/dotnet/roslyn/issues/10126
【问题讨论】:
-
该代码对我来说编译得很好,所以我怀疑这是一个特定于版本的错误,它要么已经被修补,要么是新更改的结果,具体取决于您的版本是比我的版本旧还是新.无论哪种方式,这都是 MS 支持的问题,而不是 SO。
-
您使用的是什么版本的 C#?循环检测器曾经有许多有趣的错误,这是最简单的错误之一。触发循环检测器的更复杂的拓扑非常奇怪。例如,循环检测器用于将
class N<T> {} class R : N<R.S.T> { public class S { public class T{} } }标记为循环,即使显然不是。 -
@ReyanChougle 建议的副本未使用静态字段。这是。两者完全不同。
-
@Servy 我找到了这个github.com/dotnet/roslyn/issues/10126,但仍然没有太多解释它失败的原因。
-
任何
SomeGenericStruct<MyStruct>字段都会发生这种情况,而不仅仅是Nullable<MyStruct>,与字段是否为静态无关,因此CLR 中存在此类类型的错误。无论如何,@Estecka,没有必要抱怨这个错误的警告,因为否则你的代码无论如何都会在运行时失败:)
标签: c# struct nullable static-members