如何将仅限 init 的属性的值传播到封闭类?

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

我有一个

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
本身应该实例化它的轮子。

c# compiler-errors properties access-modifiers c#-9.0
1个回答
0
投票

在 init-only 属性中初始化这些轮子对象似乎是可行的。

public int FrontWheelSpokes
{
    get => _frontWheel.Spokes;
    init => _frontWheel = new() { Spokes = value };
}

public int RearWheelSpokes
{
    get => _rearWheel.Spokes;
    init => _rearWheel = new() { Spokes = value };
}
© www.soinside.com 2019 - 2024. All rights reserved.