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