System.Action和非静态变量

时间:2017-11-14 17:22:28

标签: c# events delegates

这可能是重复的,但我找不到任何解释此行为的线程。至少不属于Action(基本上是没有返回类型的Func)。它与静态引用有关。

看看这两个例子。我只是尝试订阅System.Action OnButton1Down,以便在使用Action调用.Invoke()时调用非静态函数。

为什么第一种方法有效,但不是第二种或第三种方法?我宁愿让Action保存/准备好,所以我也可以在没有诡计的情况下再次取消订阅,只需做:OnButton1Down - =

System.Action OnButton1Down;

void MyNonStaticFunction() { }

// This example works
void MyFirstFunction()
{
    OnButton1Down += () => { MyNonStaticFunction(); };
}


// This example gives the following error on "MyNonStaticFunction()":
// "A field initializer cannot reference the non-static field, method
// or property MyNonStaticFunction()."
System.Action MyAction = () => { MyNonStaticFunction(); };

void MySecondStartFunction()
{
    OnButton1Down += MyAction;
}

// This example is to show what happens, if I just try to subscribe the raw
// method to the Action, as suggested in the comments.
// It gives the following error on "MyNonStaticFunction()":
// "Cannot implicitly convert type 'void' to type 'System.Action'."
void MyThirdStartFunction()
{
    OnButton1Down += MyNonStaticFunction();
}

我理解这些错误是有道理的,但我不明白为什么第一个例子没问题。我宁愿能够做其他任何一个例子。

1 个答案:

答案 0 :(得分:1)

在完全构造对象之前,编译器不允许您访问任何实例成员(即所有字段初始化程序都已运行)。

要解决此问题,您可以在类构造函数中初始化MyAction,该构造函数将在所有字段初始值设定项之后运行。

编辑:回复问题的第二部分:

OnButton1Down += MyNonStaticFunction();

您正在调用MyNonStaticFunction,而不是将其转换为代理人!移除(),它会更好用!