C#接口显式实现后,init属性无法在构造函数中赋值问题
显式实现接口的Init-only属性在构造函数中赋值失败的解决办法
问题根源
你遇到的报错,核心原因是:显式实现的init-only属性,当你通过(this as IHierarchable)这种类型转换后的表达式赋值时,编译器不会把它识别为构造函数内的直接this访问,哪怕你确实在构造函数里操作,也不符合init属性的赋值规则。
可行解决方案
方案1:用类内部私有属性中转(最推荐)
先在Scene类里定义一个私有可初始化的属性,把接口的显式实现映射到这个私有属性上,这样就能在构造函数里直接操作私有属性,避开类型转换的问题:
public class Scene : IHierarchable { // 私有内部属性,用于存储接口Scene属性的值 private IHierarchable? _scene { get; init; } // 显式实现接口的Scene属性,返回私有属性的值 IHierarchable IHierarchable.Scene => _scene; // 补充实现接口的Parent、Children成员... public Scene() { // 直接给私有属性赋值,完全符合init规则 _scene = null; } }
这种方式逻辑清晰,也不用绕类型转换,是最稳妥的做法。
方案2:在构造函数中使用对象初始化器
直接在构造函数里用对象初始化的语法给自己赋值,虽然看起来有点奇怪,但能解决问题:
public class Scene : IHierarchable { IHierarchable IHierarchable.Scene { get; init; } // 实现Parent、Children... public Scene() { (this as IHierarchable) = new IHierarchable { Scene = null }; } }
方案3:借助构造函数的this初始化器
如果你的类有重载构造函数,可以用this初始化器配合对象初始化来完成赋值:
public class Scene : IHierarchable { IHierarchable IHierarchable.Scene { get; init; } // 实现其他接口成员... public Scene() : this(new { Scene = (IHierarchable?)null }) { } private Scene(object initParams) { (this as IHierarchable).Scene = initParams.Scene; } }
补充说明
C#对init-only属性的赋值限制很严格:只能在对象初始化器、构造函数内直接使用this/base访问、属性的init访问器内部这三个场景下赋值。(this as IHierarchable)属于类型转换表达式,编译器不会将其认定为直接的this引用,所以哪怕在构造函数里,也会触发报错。
内容的提问来源于stack exchange,提问作者Thomas Slade
相关产品推荐
相关产品推荐

