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
我正在将我的 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
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