C# CS0106编译错误:只读属性和getter

C# CS0106编译错误:只读属性和getter,c#,compiler-errors,language-design,C#,Compiler Errors,Language Design,这可能看起来很愚蠢,但我想知道为什么下面的代码会产生CS0106编译时错误: 错误CS0106:修饰符“readonly”对此项无效 守则: class MyClass { private readonly int _value { get { if (_value < 0) return -1 * _value; return _value; } } class-MyClass { 私有只读int_值 { 得到 { 如果(_值

这可能看起来很愚蠢,但我想知道为什么下面的代码会产生CS0106编译时错误:

错误CS0106:修饰符“readonly”对此项无效

守则:

class MyClass
{
private readonly int _value
{
  get
  {
    if (_value < 0)
      return -1 * _value;
    return _value;
  }
}
class-MyClass
{
私有只读int_值
{
得到
{
如果(_值<0)
返回-1*_值;
返回_值;
}
}
据我所知,我在
get
中没有做错什么,因为我只是读取了值。 我同意,从逻辑角度来看,
readonly
的属性getter的计算看起来很笨拙

p.S.get中的代码没有实际意义-它只是一个“读取\u值的东西”

更新

简言之,最初我认为通过使用
readonly
关键字来创建只读属性是非常合乎逻辑的。 我错过了Microsoft文档中提供的关于
readonly
属性的主要内容:

readonly关键字是一个修饰符,可以在字段上使用

没有讽刺。。。 您会得到一个编译错误,因为它不是该语言语法的一部分

首先,由于只有一个
get
,那么您已经将属性设置为“readonly”

第二,您需要将属性看作是围绕两个方法的语法糖
int getValue()
void setValue(int)
。将这些方法设置为“只读”有意义吗


第三,将属性设置为只读是没有意义的,因为属性作为一个构造没有映射到内存中的任何内容。请参阅前一点,了解它基本上是一种很好的写入方式(最多)有两种方法。

对属性仅实现Get就像已经是readonly一样。因此,如果您想实现类似的行为,下面将是工作代码

class MyClass
{
    private readonly int _value = -5; // < some value> or<set it in the constructor>;
    private int ReadableValue
    {
        get
        {
            return Math.Abs(_value); 
        }
    }
}
class-MyClass
{
私有只读int _value=-5;//或;
私有int可读值
{
得到
{
返回Math.Abs(_值);
}
}
}

get-only属性已经像readonly一样了。readonly关键字是用于字段而不是属性的。即使您修复了
readonly
部分,您的属性现在也是递归的。您也需要声明一个单独的字段。为什么要将readonly放在属性上?您确定您知道自己在做什么吗?似乎是这样的e您试图将字段和属性混搭在一起,它们是两种不同的东西SvcJones是正确的。您将使用此PropertyTanks Babak获得堆栈溢出异常。看起来我更仔细地阅读了文档。它说“readonly关键字是可以在字段上使用的修饰符。”我认为我应该得到的是一个没有setter的属性,我希望我可以按照自己的意愿覆盖默认getter,直到我不写
\u值为止。在我看来这是合乎逻辑的:)谢谢Abhilash。我在学习中使用过这种语言。我只是好奇——我能用
readonly
实现只读属性吗关键字。然后我更仔细地查看了文档。它清楚地说明:“readonly关键字是可以在字段上使用的修饰符。”或者使用
Math.Abs
更清楚地说明您的intention@Default谢谢。get中的代码没有实际意义——它只是一个“读取_值的东西”