无需设置器即可设置属性。这怎么不是编译错误呢?

Den*_*nis 1 .net c#

我有课

 public class Settings : ProviderSettings {
        internal Settings(MyProvider provider) {
            this.Provider = provider;
            LoadFromConfig();
        }

        protected override IProvider Provider {
            get;
        }
}
Run Code Online (Sandbox Code Playgroud)

ProviderSettings 类是:

 public abstract class ProviderSettings {
          protected abstract IProvider Provider { get; }
 }
Run Code Online (Sandbox Code Playgroud)

在 Visual Studio 2015 中,当我以 .NET 4.0 为目标时,没有收到编译错误。我想我应该收到一个编译错误,指出“Provider 是只读的,无法设置”。为什么编译器允许这样做?

Ser*_*kiy 5

如果您不指定 setter,则仅 getter 自动属性的支持字段将隐式声明为readonly. 您可以从构造函数或使用属性初始值设定项对其进行初始化。这是 C# 6 的新功能。

所以实际上你的代码将被编译为

public abstract class ProviderSettings
{
    protected abstract IProvider get_Provider();
    // there is no property setter
}

public class Settings : ProviderSettings
{
    private readonly IProvider _provider;

    internal Settings(MyProvider provider) {
        _provider = provider; // assignment directly to backing field
        LoadFromConfig();
    }

    protected override IProvider get_Provider()
    {
        return _provider;
    }
    // there is no property setter
}
Run Code Online (Sandbox Code Playgroud)

C# 6语言规范(草案)的相关部分:

如果自动属性没有设置访问器,则支持字段被视为只读。就像只读字段一样,仅 getter 自动属性也可以分配给封闭类的构造函数的主体中。此类分配直接分配给属性的只读支持字段。

  • 这意味着它可以从构造函数中设置,如他的示例所示 (2认同)