参数必须在退出时分配

本文关键字:分配 退出 参数 | 更新日期: 2023-09-27 18:19:13

我正试图使用ConcurrentDictionary的TryRemove与lambda out如何获得错误信息Parameter must be assigned upon exit

代码:

_reminders.TryRemove(identifier, (out Reminder reminder) =>
{
    //Here i am trying to remove the item from the dictionary and instantly use the out
    //of it to perform action on it.
    reminder.Cancel();
});

为什么?

因为我觉得这段代码有点难看

代码:

Reminder rm;
_reminders.TryRemove(identifier, out rm);
rm.Cancel();

参数必须在退出时分配

我能想到的最好的方法是这样的扩展方法:

static void TryRemoveAndPerformAction<TKey, TValue>(
    this ConcurrentDictionary<TKey, TValue> dict, 
    TKey key, Action<TValue> action) 
{
    TValue value;
    if (dict.TryRemove(key, out value)) action(value);
}

然后你可以这样称呼它:

_reminders.TryRemoveAndPerformAction(identifier, rm => rm.Cancel());

根据文档,使用outref参数修饰符声明的方法参数通过引用而不是通过值传递。这允许被调用的方法更改调用方作用域中的值。

区别在于用ref 声明的参数可以在从方法返回之前赋值,但是用out 声明的参数必须在从方法返回之前赋值。