这可能是重复的,但我找不到任何解释此行为的线程。至少不属于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();
}
我理解这些错误是有道理的,但我不明白为什么第一个例子没问题。我宁愿能够做其他任何一个例子。
答案 0 :(得分:1)
在完全构造对象之前,编译器不允许您访问任何实例成员(即所有字段初始化程序都已运行)。
要解决此问题,您可以在类构造函数中初始化MyAction
,该构造函数将在所有字段初始值设定项之后运行。
编辑:回复问题的第二部分:
OnButton1Down += MyNonStaticFunction();
您正在调用MyNonStaticFunction
,而不是将其转换为代理人!移除()
,它会更好用!