You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为显式实现的接口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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 11:52:10