如何为显式实现的接口init-only属性完成初始化赋值?
解决方案
显式实现的接口成员仅能通过接口类型访问,所以MyClass类型的对象无法直接在初始化器中访问IFoo.MyProp。针对你的需求,有两种可行的解决方式:
方式一:在类中暴露公共的init-only属性,显式实现的接口成员委托给该属性
这种方式既满足接口显式实现的要求,又能直接用MyClass类型进行对象初始化:
interface IFoo { int MyProp { get; init; } } class MyClass : IFoo { // 公共的init-only属性,供对象初始化器使用 public int MyProp { get; init; } // 显式实现接口成员,内部委托给类的公共属性 int IFoo.MyProp { get => MyProp; init => MyProp = value; } }
此时初始化代码可以正常编译:
MyClass c = new() { MyProp = 123, };
方式二:通过接口类型进行对象初始化,再转换为类类型
如果不想在类中额外暴露公共属性,可以先使用IFoo类型初始化对象,之后再强制转换为MyClass:
// 先以IFoo类型初始化,此时可以访问显式实现的init属性 IFoo fooInstance = new MyClass() { MyProp = 123, }; // 转换为MyClass类型(确保类型安全的话可以用as运算符) MyClass c = (MyClass)fooInstance;
需要注意的是,第二种方式如果涉及类型转换,要确保转换的对象确实是MyClass实例,避免运行时类型转换异常。
内容的提问来源于stack exchange,提问作者Mario Vernari
相关产品推荐
相关产品推荐

