【发布时间】:2016-06-30 09:58:02
【问题描述】:
当我尝试使用以下代码扩展 IDictionary 时
type Generic.IDictionary<'TKey, 'TValue> with
member this.GetOrAdd (key:'TKey, fun':'TKey -> 'TValue) =
match this.ContainsKey(key) with
| true -> this.Item(key)
| false ->
let val_ = fun' key
this.Add(key, val_)
val_
let dd = dict[(1,2); (3,4)]
let f = fun x -> 2*x
let d5 = dd.GetOrAdd(5, f)
我在运行时遇到以下错误。
System.NotSupportedException:引发类型 >'System.NotSupportedException' 的异常。 在 Microsoft.FSharp.Core.ExtraTopLevelOperators.dictValueType@98.System->Collections-Generic-IDictionary
2-Add(TKey key, T value) at FSI_0011.IDictionary2.GetOrAdd[TKey,TValue](IDictionary2 this, >TKey key, FSharpFunc2 fun') 在 >D:\BaiduYunDownload\DroiEtl\ Droi.MyToPG\Util.Sync.fs:第 259 行 在 .$FSI_0018.main@() in >D:\BaiduYunDownload\DroiEtl\Droi.MyToPG\Util.Sync.fs:line 264 由于错误而停止
但是编译器在构建时不会抱怨... 请帮帮我...
【问题讨论】:
-
使用
TryGetValue而不是ContainsKey会稍微快一些,因为“已经存在”的代码路径只需要进行一次字典查找,而不是您现在正在执行的两次查找.