当我们定义像
这样的属性时 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.
实际上为什么编译器无法自动确定属性并生成代码?有什么问题?
答案 0 :(得分:56)
因为自动实现的属性为属性值生成自己的后备存储。您无权访问内部商店。
使用
实现属性表示正常属性
private int _data;
public int Data{ get { return _data } };
这里的父类可以在类中的其他地方执行以下操作(它不能使用自动道具)
_data = 100;
注意:您可以像这样定义一个自动道具(这是我最常用的方式)。
public int Data { get; private set;}
这意味着该类的外部客户端无法设置该属性。但是,包含类本身可以通过类定义中的this.Data = x;
多次设置属性。
答案 1 :(得分:5)
如果没有setter,则该属性永远不会有除默认值以外的任何内容,因此不会用于任何目的。
答案 2 :(得分:2)
接收此错误的更现代的方案是使用小于VS 2015(或使用小于14的MsBuild)的VisualStudio版本构建使用C#6语法的代码。
在C#6.0中,允许使用没有setter的autoProperties(它们被假定为私有集)。
尝试使用VS2015 +或msbuild 14+编译..或修改代码,以便所有autoProperties都有一个setter。