c# - 静态成员导致结构布局中的循环

标签 c# struct nullable static-members

public struct MyStruct {
    static MyStruct? myProperty;
}

尝试编译它会给我错误:
结构成员“myStruct.myProperty”导致结构布局中出现循环

据我所知,当结构的实例包含自己的结构作为属性(这对我来说很有意义)时,通常会发生此错误。
但在这里,它是关于 static 属性的,所以我看不出这样的递归是如何发生的。另外,该错误仅在声明 Nullable 结构时发生,声明静态非 nullable 是安全的。

这里到底发生了什么会导致循环?


编辑:
我确实找到了我应该重复的问题;它解释了为什么当 Instance 有自己类型的成员时会发生递归,但这里是关于静态成员的。 我从经验中知道 struct 可以有自己类型的 static 成员,不会在运行时中断,这个特定代码似乎只是中断,因为静态成员是 Nullable。

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

最佳答案

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

第一,带有访问器的属性工作正常,所以在需要只读的地方你可以这样做:

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

其次,只要它是嵌套的,您仍然可以将字段存储在结构中的某处:

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

后者有点丑(幸运的是我不需要 setter),但至少这是一个可行的解决方法。

关于c# - 静态成员导致结构布局中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47443178/

相关文章:

c# - VSTO Outlook 嵌入图像 MailItem

c - C中结构中的段错误

c++ - 谁能帮我把这个结构翻译成delphi记录?

c# - 重载方法签名 - 编译器将可空类型视为常规值类型的同义词

c# - Nullable<T> 混淆

c# - JsonPropertyAttribute 中的 JSON.NET NullValueHandling 未按预期工作

c# - 删除动态定时器

c# - 无法将服务引用添加到自承载 WCF 服务

ios - 面向协议(protocol)的编程示例在 swift 3.0 中不起作用

typescript - 为什么 typescript 在实现抽象函数时忽略严格的空检查?