【问题标题】:Using Func with instance method将 Func 与实例方法一起使用
【发布时间】:2010-06-23 18:22:48
【问题描述】:
public class x : y
{    

public Func<user, bool> SendStuffAction = SendStuff;

//overridden from y
public override bool SendStuff(user u)
{
  //do stuff
}

}

使用上面的代码,其中 SendStuff 是一个本地覆盖的实例方法,我得到一个上下文错误,即 SendStuff 不是静态的。委托不能从 SendStuff 方法所在的同一个类中指向实例方法吗?

错误是:无法在非静态上下文中访问静态方法

如果方法是私有的,那为什么它不起作用。

private Func<user, bool> SendStuffAction = SendStuff;

【问题讨论】:

  • 发布更多代码。这件看起来不错
  • 谁能解释一下为什么 SendStuffAction 被视为静态的?
  • 如果你使用一个方法作为字段初始化器,它总是必须是一个静态方法。在字段初始化之前,无法保证实例处于一致状态,因此不允许使用实例方法。

标签: c#


【解决方案1】:

是的,它可以...但是,如果你不声明为静态,你需要在构造函数中设置它。

class MyClass
{
   public Func<loan, user, bool> SendStuffAction ;

   MyClass()
   {
      SendStuffAction = SendStuff;
   }

   bool SendStuff(loan loanVar, user userVar)
   {
      return true;
   }
}

【讨论】:

  • 谢谢,但你能解释一下这是为什么吗?
  • +1 interesting, hadn't realised this。正如托比在上面的主要问题的 cmets 中提到的那样,在字段初始化程序中使用非静态成员会打开它以在其他地方使用,而正在构造的实例处于未知状态(初始化程序以未知顺序执行)。您可以在构造函数中执行此操作,因为字段初始化程序已经完成,并且您可以控制任何剩余初始化的顺序,但您仍然必须小心。
猜你喜欢
  • 2016-09-13
  • 1970-01-01
  • 2014-08-27
  • 1970-01-01
  • 2020-03-25
  • 2018-04-23
  • 2014-11-03
  • 1970-01-01
  • 2014-01-02
相关资源
最近更新 更多