代码之家  ›  专栏  ›  技术社区  ›  Nasser Hadjloo

为什么自动实现的属性必须同时定义get和set访问器

  •  30
  • Nasser Hadjloo  · 技术社区  · 16 年前

    当我们定义一个属性

        public string Name {get; set;}
    

    网络可以使我们的属性代码。但是当我们使用

        public string Name {get;}
        public string Name {set;}
    

    我们面对

    'Hajloo.SomeThing.PropertyName.set' must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors.
    

    实际上,为什么编译器不能确定属性并自动生成代码?有什么问题吗?

    3 回复  |  直到 15 年前
        1
  •  60
  •   Gishu    16 年前

    因为自动实现的属性为属性值生成自己的后备存储。您无权访问内部存储。

    使用实现属性

    • 刚设置:意味着您只能设置值。无法检索属性值。

    private int _data;
    public int Data{  get { return _data } };
    

    在这里,父类可以在类中的其他地方执行以下操作(使用auto-props则不行)

    _data = 100;

    public int Data { get; private set;}
    

    这意味着该类的外部客户端无法设置该属性。但是,包含类本身可以通过 this.Data = x; 在类定义中。

        2
  •  5
  •   to StackOverflow    16 年前

    如果没有setter,属性就不能有默认值以外的任何内容,因此不起任何作用。

        3
  •  3
  •   Bill Tarbell    8 年前

    接收此错误的更现代的场景是使用小于VS 2015的VisualStudio版本(或使用小于14的MsBuild)生成使用C#6语法的代码。

    在C#6.0中,允许自动属性没有setter(假定它们是私有集)。

    尝试使用VS2015+或msbuild 14+编译。。或者修改代码,使所有自动属性都有一个setter。