当我意识到 F#map
实现了 IDictionary<'Key, 'Value> 并ICollection<KeyValuePair<'a, 'b>>
考虑到两者都支持突变(添加和删除)作为合同的一部分时,我有些惊讶。
map
只看它的实现,当你试图引起突变时除外!
let map = [| (1, "one"); (2, "two") |] |> Map.ofArray
let dict = map :> IDictionary<int, string>
dict.Add(3, "three");;
上面的代码抛出异常:
System.NotSupportedException:地图值不能被改变。在 Microsoft.FSharp.Collections.FSharpMap
2.System-Collections-Generic-IDictionary
2-Add(TKey k, TValue v) at .$FSI_0007.main@() 由于错误而停止
这是预期的。
对于一个不可变集合来说,能够将自己暴露为一个可变集合,只是为了在该集合的消费者试图引起突变时抛出异常,这似乎是一个危险的决定。
我在这里错过了什么吗?