我有一个
Wheel
类,具有 仅 init 属性 Spokes
:
public class Wheel
{
internal Wheel() { }
public int Spokes { get; init; }
}
对于此类的功能来说至关重要的是,在
Spokes
对象实例化之后,Wheel
是不可变的。因此,非常希望该属性仅用于 init,并由 readonly
字段支持。
现在我有一个
Bicycle
类,其中包含 Wheel
类的两个实例:
public class Bicycle
{
private readonly Wheel _frontWheel = new();
private readonly Wheel _rearWheel = new();
public int FrontWheelSpokes
{
get => _frontWheel.Spokes;
init => _frontWheel.Spokes = value;
}
public int RearWheelSpokes
{
get => _rearWheel.Spokes;
init => _rearWheel.Spokes = value;
}
}
该类的预期用途是:
Bicycle bicycle = new() { FrontWheelSpokes = 32, RearWheelSpokes = 24 };
不幸的是这段代码无法编译。我在
init => _xxxWheel.Spokes = value;
行中收到两个编译错误:
仅 Init 属性或索引器“Wheel.Spokes”只能在对象初始值设定项中分配,或者在实例构造函数或“init”访问器中的“this”或“base”上分配。
在线演示.
我可以做些什么来修复编译错误,而不影响属性
Wheel.Spokes
、Bicycle.FrontWheelSpokes
和 Bicycle.RearWheelSpokes
的“仅限初始化性”?另外,我不想将 Wheel
类的构造函数暴露给外墙。只有 Bicycle
本身应该实例化它的轮子。
在 init-only 属性中初始化这些轮子对象似乎是可行的。
public int FrontWheelSpokes
{
get => _frontWheel.Spokes;
init => _frontWheel = new() { Spokes = value };
}
public int RearWheelSpokes
{
get => _rearWheel.Spokes;
init => _rearWheel = new() { Spokes = value };
}