我有课
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 是只读的,无法设置”。为什么编译器允许这样做?
如果您不指定 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 自动属性也可以分配给封闭类的构造函数的主体中。此类分配直接分配给属性的只读支持字段。