ImmutableDictionary.GetValueOrDefault为何在此返回null?
问题原因与解决办法
这问题出在不可变集合的特性和F#的变量绑定规则上:
- ImmutableDictionary是不可变集合:它的
Add方法不会修改原字典对象,而是返回一个包含新增键值对的全新字典,原字典的内容完全不会被改变。 - F#的let绑定是不可变的:你代码里的
dict = dict.Add(key, "xyz")这一行,并不是给原dict赋值,而是在做相等性判断(判断原dict和新返回的字典是否相等),这行代码的结果是个布尔值但没被存储,原dict依然是最初创建的空字典。
所以当你调用dict.GetValueOrDefault(key)时,操作的还是那个空字典,自然找不到对应key,返回<null>。
修正后的代码可以这样写:
open System.Collections.Immutable let dict = ImmutableDictionary.Create() let key = "abc" // 用let重新绑定变量,接收Add返回的新字典 let dict = dict.Add(key, "xyz") dict.GetValueOrDefault(key) |> printfn "%A"
或者单独用新变量存储新字典:
open System.Collections.Immutable let originalDict = ImmutableDictionary.Create() let key = "abc" let updatedDict = originalDict.Add(key, "xyz") updatedDict.GetValueOrDefault(key) |> printfn "%A"
内容的提问来源于stack exchange,提问作者sdgfsdh
相关产品推荐
相关产品推荐

