为什么只有自动实现的属性才能在 C# 中具有初始值设定项?

Izz*_*zzo 2 c# properties

尝试执行以下操作时,出现“只有自动实现的属性可以在 C# 中具有初始值设定项”错误:

   public int Precision
    {
        get { return Precision; } 
        set
        {
            if (value < 0)
                Precision = 0;
            else if (value > 15)
                Precision = 15;
            else
                Precision = value;
        }
    } = 12;
Run Code Online (Sandbox Code Playgroud)

为什么这是不允许的?

kal*_*ave 8

很确定这不是您使用getand 的方式set。此外,您的 get 会受到自我参考的影响。我认为这就是你想要的:

private int _precision = 12;
public int Precision {
    get => _precision;
    set {
        if (value < 0)
            _precision = 0;
        else if (value > 15)
            _precision = 15;
        else
            _precision = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @Izzo 这个问题如何回答“为什么初始化器只允许用于自动属性”? (3认同)

Him*_*ere 6

嗯,自动属性只是获取和设置自动创建的支持字段的属性的语法糖。所以下面的两个代码段是相似的:

\n
public int Precision { get; set; }\n
Run Code Online (Sandbox Code Playgroud)\n

\n
public int Precision\n{\n    get { return <Precision>k__BackingField; } \n    set { <Precision>k__BackingField = value; }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然而,当您在属性中创建一些自己的逻辑时,就没有自动支持字段之类的东西了。事实上,您甚至可以在没有任何背景字段的情况下执行以下操作:

\n
set { Console.WriteLine(); }\n
Run Code Online (Sandbox Code Playgroud)\n

然而,初始值被解析为以下构造函数:

\n
MyClass()\n{ \n    this.<Precision>k__BackingField = myValue; \n}\n
Run Code Online (Sandbox Code Playgroud)\n

但是,当没有这样的后备字段时,编译器应该在这里做什么?

\n