假设我们有一个类,它必须只有一个无参数构造函数。该类还定义了一个仅限 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,
};
另外,我不知道任何可能的语法。
有什么办法可以实现这个目标吗?
来自文档:
显式接口实现没有访问修饰符,因为它不能作为定义它的类型的成员进行访问。相反,只有通过接口实例调用时才能访问它。
为了使实例化成为可能,您还需要将该属性实现为接口的非显式实现:
class MyClass : IFoo
{
private int _myProp;
int IFoo.MyProp
{
get => MyProp;
init => MyProp = value;
}
public int MyProp
{
get => _myProp;
init => _myProp = value;
}
}
当然,如果您不希望
IFoo.MyProp
使用非显式实现作为“支持属性”,您可以更改它。