【问题标题】:get must declare a body it is not marked abstract, extern, or partialget 必须声明一个没有标记为抽象、外部或部分的主体
【发布时间】:2015-10-30 08:23:43
【问题描述】:

我在下面写了这行代码,但错误突出显示,如下:

get 必须声明一个没有标记为抽象、外部或部分的主体

我不明白问题是什么?为什么集合不能在不破坏get 的情况下调用方法?

 public string NoteColour { get; set { SetFontColour(value); } }

【问题讨论】:

  • 因为不清楚get 应该做什么。如果它会自动生成一个字段,则永远无法设置该字段。

标签: c# .net properties


【解决方案1】:

您必须为get 提供一个实现,因为如果getset 都没有实现,编译器只允许自动实现的属性。

如果你实现其中任何一个,你也必须为另一个提供一个实现。

我希望有这样的东西:

 public string NoteColour { get { return GetFontColor(); } set { SetFontColour(value); } }

【讨论】:

  • 虽然这解决了编译器问题,但它现在造成了对属性的相当不愉快的滥用,因为现在存在违反最小惊讶原则的风险。 OP 最好直接公开GetFontColor()SetFontColour() 方法。
  • 不确定。出于某些目的,您希望拥有属性(例如,它们可以绑定到 UI)。
  • 啊,好点子。你可以说我最近没有做任何绑定,因为我忘记了。
【解决方案2】:

错误提示您需要为get 方法提供主体。因此,如果您自己创建了属性,那么您必须同时实现 get 和 set 或不实现。

public string NoteColour 
{ 
   get 
   { 
     return GetMethod(); 
   } 
   set 
   { 
     SetFontColour(value); 
   } 
}

【讨论】:

    【解决方案3】:

    如果您不为getset 编写正文,则会调用一个宏,该宏会为您的属性添加一个隐藏的私有字段以存储实际值。这是必需的,因为属性没有与之关联的内存,并且只是像处理类对象的方法一样。它使您确信不要像过去那样编写明确的 getter 或 setter 方法。

    如果你想做自定义的事情(除了简单地封装一个字段),你必须声明两个主体,因为宏不知道它应该返回哪个字段。

    只是为了完整性:

    private string noteColor = string.Empty;
    
    public string NoteColour
    {
        get
        {
            return this.noteColor;
        }
        set
        {
            // add custom actions needed here
            this.noteColor = value;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多