C# 错误消息 "Property can not be assigned to -- it is read only."

C# error message "Property can not be assigned to -- it is read only."

可以在构造函数中分配只读属性。但是当我尝试显式实现 get 方法时,编译器显示错误(属性 无法分配给 -- 它是只读的。)我可以实现 getter 还是应该没有实现?

public class PersonalIncome 
{
    private decimal _anualRate;
    public decimal AnualRate
    {
        get { return _anualRate != 0 ? _anualRate : 40_000;  }
    }

    public PersonalIncome(decimal paymentRate)
    {
        switch (paymentRate)
        {
            case var rate when (rate > 300):
                AnualRate = rate; // **Property can not be assigned to -- it is read only.**
                break;
            default:
              break;
        }
    }
}

您可以实施 getter,但您只能直接为支持字段赋值:

_anualRate = rate; 

一旦您决定不使用自动 属性 的便利,您就必须自己做所有事情。

您引用了 属性 和 readonly 支持字段。

这正是编译器在使用具有默认值的自动实现 属性 时从 C#6 向上生成的内容:

int MyProperty { get; } = -1;

这将被翻译成以下内容:

readonly int _myProperty = -1;
int MyProperty { get { return this._myProperty; } }

现在,编译器会用后备字段替换对 属性 的每个调用。然而,这只适用于没有定义主体的自动属性。在您的情况下,您已经有了一个,这就是为什么编译器无法替换那个的原因。作为一个 属性 本身不过是一个 get- 和一个 set- 方法,你想要做的是以下,这显然是无意义的:

int get_MyProperty() { return this._MyProperty; }
...
this.get_MyProperty() = 1;

这适用于自动 属性 的原因是编译器知道如何替换对 属性 的调用。但是,假设您自己的 getter 更复杂:

get
{
    DoSomething();
    return this._myProperty + 5;
}

现在编译器无法替换对 属性 的调用。

因此,让您自己的 get-implementation tigether 与仅获取的 属性 的唯一方法是使用支持字段:

this._myProperty = 1;

您的 class 可以这样重写:

public class PersonalIncome
{
    public decimal AnualRate { get; private set; }

    public PersonalIncome(decimal paymentRate)
    {
        AnualRate = paymentRate > 300 ? paymentRate : 40_000;
    }
}