【问题标题】:Static member causes Cycle in the struct layout静态成员导致结构布局中的循环
【发布时间】: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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-05
    • 2014-07-15
    • 2012-03-06
    • 2017-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多