是否可以设置仅用于初始化的显式实现属性?

问题描述 投票:0回答:1

假设我们有一个类,它必须只有一个无参数构造函数。该类还定义了一个仅限 init 的 setter 属性。

class MyClass
{
    public int MyProp { get; init; }
}

从 C# 9 开始,我们只能在构造时设置该属性:

MyClass c = new()
{
    MyProp = 123,
};

到目前为止,一切都很好。

现在,我们假设某个接口需要该属性,并且我们需要显式实现该接口:

interface IFoo
{
    int MyProp { get; init; }
}

class MyClass : IFoo
{
    private int _myProp;

    int IFoo.MyProp
    {
        get => _myProp;
        init => _myProp = value;
    }
}

但是,这不会编译:

MyClass c = new()
{
    MyProp = 123,
};

另外,我不知道任何可能的语法。

有什么办法可以实现这个目标吗?

c# interface properties initialization
1个回答
0
投票

来自文档

显式接口实现没有访问修饰符,因为它不能作为定义它的类型的成员进行访问。相反,只有通过接口实例调用时才能访问它。

为了使实例化成为可能,您还需要将该属性实现为接口的非显式实现:

class MyClass : IFoo
{
    private int _myProp;

    int IFoo.MyProp
    {
        get => MyProp;
        init => MyProp = value;
    }

    public int MyProp
    {
        get => _myProp;
        init => _myProp = value;
    }
}

当然,如果您不希望

IFoo.MyProp
使用非显式实现作为“支持属性”,您可以更改它。

© www.soinside.com 2019 - 2024. All rights reserved.