F# - 在 dotnet 5 中使用 Concurrent.ConcurrentDictionary.TryRemove

F# - Using Concurrent.ConcurrentDictionary.TryRemove with dotnet 5

我正在将我的 F# 代码从 dotnet3.1 迁移到 5 并努力处理以下代码:

        let tryRemove key (dict: Concurrent.ConcurrentDictionary<'a, 'b>) =
           match dict.TryRemove(key) with
           | (true, v) -> Some v
           | (false, _) -> None

在 3.1 TryRemove 中返回元组,在版本 5 中它只返回布尔值。要从字典中获取值,我需要将引用作为 TryRemove 的第二个参数传递。 执行此操作并避免返回 null v 的正确方法是什么?

我试过以下代码:

    let tryRemove key (dict: Concurrent.ConcurrentDictionary<'a, 'b>): 'b option =
       let mutable v: 'b = null
       match dict.TryRemove(key, &v) with
       | true -> Some v
       | _ -> None

但是现在使用它的函数认为 tryRemove

的选项中可以有 null

error FS0001: The type '(Body -> unit)' does not have 'null' as a proper value

其中 b' is (Body -> unit)

我刚刚弄明白了:

let mutable v = Unchecked.defaultof<'b>

而不是

let mutable v: 'b = null

有效,但超级奇怪的是 带有 last out 参数 的简化语法转换为 元组结果 无效不再。是吗?

编辑
它仍然有效!查看正确答案:)

问题是 .NET 5 添加了重载。之前只有 TryRemove (key : 'a, byref<'b> value) : bool,现在选择了新的重载 TryRemove(item: KeyValuePair<'a, 'b>) : bool。参见 netcore 3.1 vs NET 5

另一种解决方案是添加类型注释,例如

let tryRemove (key: 'a) (dict: Concurrent.ConcurrentDictionary<'a, 'b>) =
   match dict.TryRemove(key) with
   | (true, v) -> Some v
   | (false, _) -> None