【问题标题】:Setting a property without a setter. How is this not a compile error?在没有设置器的情况下设置属性。这怎么不是编译错误?
【发布时间】:2017-02-02 06:46:37
【问题描述】:

我有课

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

        protected override IProvider Provider {
            get;
        }
}

ProviderSettings 类是:

 public abstract class ProviderSettings {
          protected abstract IProvider Provider { get; }
 }

在 Visual Studio 2015 中,当我面向 .NET 4.0 时没有出现编译错误。我想我应该收到一个编译错误,说“提供程序是只读的,无法设置”。为什么编译器允许这样做?

【问题讨论】:

  • 快速问题:您打算如何在没有正文的 getter 中设置属性值?您希望使用 getter 的结果是什么?
  • 使用我将在构造函数中设置并使用 getter 返回的支持字段。
  • 这样写代码会发生什么?
  • 它是这样工作的,但我不小心使用了该属性,并且很惊讶编译器没有对我吐槽。
  • .NET 版本并不意味着 C# 版本。这是 C# 6 的一个特性,VS 2015 中的所有代码都将在该特性下编译。如果您愿意,可以在 .NET 2.0 中使用它。

标签: c# .net


【解决方案1】:

如果您不指定 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
}

C# 6 Language Specification(草稿)的相关部分:

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

【讨论】:

  • 也就是说可以从构造函数中设置,如他的例子
猜你喜欢
  • 2014-01-07
  • 2011-05-01
  • 2019-06-16
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多