【发布时间】:2019-01-30 15:42:55
【问题描述】:
这里是测试类:
public class TestClass
{
private readonly Action _action;
public TestClass()
{
_action += () => { Console.WriteLine("1"); };
Subscribe(_action);
_action?.Invoke();
}
private static void Subscribe(Action action)
{
action += () => { Console.WriteLine("2"); };
}
}
在运行时不会打印“2”,因为订阅该操作的 lambda 不会被调用。
在我看来,当将 Action 作为参数传递时,它是按值传递的(在 C++ 术语中),因此对 += 运算符的调用发生在 Action 的另一个实例上。
如何将 Action 作为参数传递,以便以后可以使用 += 运算符订阅它。或者也许使用 Actions 对这个目的无效?
【问题讨论】:
-
传递by reference 不适用于您的方案吗?
-
action += () => { Console.WriteLine("2"); };是action = action + () => { Console.WriteLine("2"); };的简写 所以你实际上是在创建一个新动作,而这个新动作永远不会离开Subscribe的范围 -
因此,结合前面的两个 cmets 似乎意味着将
Subcribe方法更改为void Subscribe(ref Action action)可能会起作用。你传入一个动作,引用将被修改为一个现在有两个委托的新动作,并传回给调用者(通过Subscribe(ref _action);
标签: c# events lambda delegates