35

当我们定义一个属性时

    public string Name {get; set;}

dot net 可以制作我们的属性代码。但是当我们使用

    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.

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

4

4 回答 4

61

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

实现一个属性

  • just get : 表示您只能检索值。您永远无法设置属性值(即使在包含类中)
  • just set :意味着您只能设置值。您无法检索属性值。

对于普通属性

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

在这里,父类可以在类的其他地方执行以下操作(它不能使用自动道具)

_data = 100;

注意:您可以像这样定义一个自动道具(这是我最常用的方式)。

public int Data { get; private set;}

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

于 2010-04-08T06:17:35.703 回答
5

如果没有设置器,则该属性永远不能具有默认值以外的任何内容,因此没有任何用途。

于 2010-04-08T06:08:06.830 回答
3

接收此错误的更现代方案是使用低于 VS 2015 的 VisualStudio 版本(或使用低于 14 的 MsBuild)构建使用 C#6 语法的代码。

在 C#6.0 中,允许具有没有设置器的 autoProperties(假定它们是私有集)。

尝试使用 VS2015+ 或 msbuild 14+ 进行编译 .. 或修改代码,使所有 autoProperties 都有一个设置器。

于 2018-02-21T06:26:24.340 回答
0

如何在C#中为null的情况下分配默认值

如果 c# 中的值为 null,则为对象分配默认值 [重复] ” 此顶部已关闭,表示它已被此操作。但是,在我看来,此处发布的所有内容都不能回答该主题,因此我在此处发布(无法在此处发布)对我有用且我一直在寻找的内容:

decimal default_value = 0.00m;
return (decimal?)json['JSON_KEY'] ?? default_value;

在上面的示例中,我试图设置一个默认值,以防从 json 中提取小数为 null(就像我们可以在 kotlin 或 swift 中那样)。Ps:此实现适用于 .NET 框架的新版本。

于 2022-02-16T14:35:30.950 回答