为什么 C# 不从 Action 委托中删除侦听器?

Why is C# is not removing listeners from an Action delegate?

所以我在 Unity 中为游戏构建了一个非常基本的事件管理器,并且我将 Actions 的引用保存在字典中,如下所示:

public void SubscribeToAction(string actionKey, Action<object> listener)
{
    Action<object> action;
    if(actionList.TryGetValue(actionKey, out action)){
        action += listener;
    }else{
        action += listener;
        actionList.Add(actionKey, action);
    }
}

但是发生的事情是,即使我在退出场景时取消订阅,我发现正在对旧听众进行调用并且我得到一个空异常:

public void UnSubscribe(string actionKey, Action<object> listener)
{
    Action<object> action;
    if(actionList.TryGetValue(actionKey, out action)){
        action -= listener;
    }
}

我找到的唯一解决方案是在退出场景时清除整个字典,然后在 start() 方法上再次添加订阅。

action += listener;action -= listener; 只是改变局部变量 action。他们没有改变字典中的值。如果您想更改字典中的值,您需要 设置该字典中的值 ,在您的情况下,设置为 action.[=14= 的值]