C#错误消息“无法将属性分配给它-是只读的。”

时间:2018-11-01 20:46:21

标签: c# properties readonly

可以在构造函数中分配只读属性。但是,当我尝试显式实现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;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您可以实现getter,但随后只能将值直接分配给后备字段:

_anualRate = rate; 

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

答案 1 :(得分:1)

您的班级可以这样重写:

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

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

答案 2 :(得分:0)

您指的是具有readonly后备字段的属性。

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

int MyProperty { get; } = -1;

这将被翻译为以下内容:

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

现在,编译器将用后备字段替换对属性的每次调用。但是,这仅适用于未定义主体的自动属性。在您的情况下,您已经有一个,这就是为什么编译器无法替换那个。由于属性本身就是一种获取方法和设置方法,因此您要做的是以下操作,这显然是毫无意义的:

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

之所以对自动属性起作用,是因为编译器知道如何替换对属性的调用。但是,假设您自己的吸气剂更加复杂:

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

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

因此,拥有自己的具有get-only属性的get-implementation tigether的唯一方法是使用backing-field:

this._myProperty = 1;