静态成员导致struct布局中的Cycle

时间:2017-11-22 20:12:43

标签: c# struct nullable static-members

public struct MyStruct {
    static MyStruct? myProperty;
}

尝试编译它会给我错误:
Struct member 'myStruct.myProperty' causes a cycle in the struct layout

从我收集的内容中,当结构的实例包含自己的结构作为属性时(这对我来说很有意义),通常会发生此错误。
但在这里,它是关于静态属性,所以我不知道这样的递归是如何发生的。另外,只有在声明Nullable结构时才会发生错误,声明静态非可空是安全的。

这里究竟发生了什么会导致一个循环?

修改
我确实发现了我认为是重复的问题;它解释了当 Instance 具有自己类型的成员时发生递归的原因,但这是关于静态成员的。 我从经验中知道struct可以拥有自己类型的 static 成员,这些成员在运行时不会中断,这个特定的代码似乎只是因为静态成员是Nullable而中断。

其次,多个人马上告诉我代码为他们编译;似曾相识,我正在使用的c#的“版本”是针对Unity的,所以我认为这是他们编译器的另一个错误,我会向他们提出这个问题。
@Evk指出这实际上是一个常见问题: https://github.com/dotnet/roslyn/issues/10126

1 个答案:

答案 0 :(得分:1)

在寻找解决方法时,我发现了两件事:

其中一个,带访问器的属性工作正常,所以只要需要Readonly,你就可以这样做:

public struct myStruct {
    public static myStruct? myProperty { get{ /*...*/ } } 
}

其次,只要它嵌套在一起,你仍然可以在结构中的某个地方存储一个字段:

public struct myStruct {
    public static class nest {
        public static Nullable<myStruct> myNestedProperty;
    }
}

后者有点难看,(幸运的是我不需要制定者),但至少这是一个有效的解决方法。