获取错误“必须声明一个正文,因为它没有标记为抽象或外部”

时间:2010-08-23 14:42:16

标签: c# winforms

我有一个方法Modify,它在里面做一个ClientModify操作。

public bool Modify()
{
  bool retval = false;

  retval = Spa.ClientModify(col);    
}

这里我想要的是ClientModify应该只在事件处理程序“ServerEvents”中完成三个事件后执行,否则它应该返回(retval)false。如何对“Spa.ClientModify”进行检查

  static private void ServerEvents(eventType type, event this_event, object passback)
    {
             if (this_event.type == eventType.SPD_spurtEvent)
            { 

           if (this_event.objectName == "ready")
            {                  
           // some operation 
            }
           else if (this_event.objectName == "info")
            {
           // some operation
            }

           else if (this_event.objectName == "serverstate")
            {
           // some operation
            }

        }

}

所以我做的是

 public class Server : ModelObject, IServer
    {
   public class MyState
{
    public bool Method1HasExecuted { get; set; }
    public bool Method2HasExecuted { get; set; }
    public bool Method3HasExecuted { get; set; }
}
   }

        static private void ServerEvents(eventType type, event this_event, object passback)
        {
          MyState s = new MyState();

each three operation i did  check like this  s.Method1HasExecuted = true; like this 
}

and modify method i did this way
    public bool Modify()
    {
        return MyClassState.Method1HasExecuted && MyClassState.Method2HasExecuted && MyClassState.Method3HasExecuted ? Spa.ClientModify() : false;
    }

}

然后我收到错误Spo.Plugins.Server.MyState.Method1HasExecuted.get'必须声明一个正文,因为它没有标记为抽象或外部,是否还有其他方式

6 个答案:

答案 0 :(得分:3)

public bool Method1HasExecuted { get; set; }Auto-implemented property,可从C#3.0开始提供。

您使用的是C#2.0吗?然后你必须写出那个属性:

private bool _method1HasExecuted;
public bool Method1HasExecuted 
{
  get { return _method1HasExecuted; }
  set { _method1HasExecuted = value; }
}

答案 1 :(得分:2)

您正在使用.net 2.0,因此您无法使用自动实现的属性。您需要将MyState类更改为:

public class MyState 
{ 
    private bool _method1HasExecuted;
    private bool _method2HasExecuted;
    private bool _method3HasExecuted;

    public bool Method1HasExecuted
    {
        get
        {
            return _method1HasExecuted;
        }
        set
        {
            _method1HasExecuted = value;
        }
    }

    public bool Method2HasExecuted
    {
        get
        {
            return _method2HasExecuted;
        }
        set
        {
            _method2HasExecuted = value;
        }
    }
    public bool Method3HasExecuted
    {
        get
        {
            return _method3HasExecuted;
        }
        set
        {
            _method3HasExecuted = value;
        }
    }
} 

答案 2 :(得分:1)

public bool Method1HasExecuted { get; set; }

此属性的get / set方法未实现,因此这就是编译器抱怨的原因。实现属性的setter和getter以消除错误。

答案 3 :(得分:0)

通常情况下,当您将方法定义为除abstractextern以外的任何其他方法但您没有正文时,会出现标题中引用的错误。可能类似下列之一:

public virtual void DoStuff();
public int GetANumber();
public string ReturnAString();

这些都不会编译。根据你提供的内容,我的猜测是你有一些方法(可能ClientModify,因为我没有在你发布的代码中看到它的定义),这个方法是用名称和签名定义的,但没有正文。

如果不是这种情况,请指定编译器错误所引用的方法(如果没有在错误消息中指定,可以通过双击VS中的错误来获取此信息)并发布代码和引用它的代码示例。

答案 4 :(得分:0)

您尚未发布IServer界面,但是,错误很可能是因为您没有在类Server中的接口IServer上实现所有方法或属性

如果您使用的是.NET 3.5或更高版本,那么公共bool Method1HasExecuted {get;组;将是一个自动属性

我不确定我是否完全理解你的问题,但你需要挂钩3个不相关的方法调用,以便你可以在你的statemanagement类中标记相应的布尔值?

答案 5 :(得分:0)

你是如何编译的?代码public bool Method1HasExecuted { get; set; }是有效的C#3(自动实现的属性)但不是有效的C#2(没有自动实现的属性)。对于C#2,它看起来像你写了一个抽象或外部属性,但没有标记它。检查您是否正在使用3.5 Framework进行编译。