Failed to execute extended extension IDictionary #

When I try to extend an IDictionary with the following code

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)

I got the following runtime error.

System.NotSupportedException: Type exception> 'System.NotSupportedException' is thrown. at Microsoft.FSharp.Core.ExtraTopLevelOperators.dictValueType@98.Sy stem-> Collections-Generic-IDictionary 2-Add(TKey key, T value) at FSI_0011.IDictionary2.GetOrAdd [TKey, TValue] (IDictionary 2 this, >TKey key, FSharpFunc2 fun ') at> D: \ BaiduYunDownload \ DroiEtl \ DroiGilTomTomTy .Sync.fs: line 259. $ FSI_0018.main @ () in> D: \ BaiduYunDownload \ DroiEtl \ Droi.MyToPG \ Util.Sync.fs: line 264 Stopped due to an error

But the compiler does not complain when creating ... Please help me ...

+4
1

dict , IDictionary<_,_> - .Add, .

Dictionary, , :

open System.Collections.Generic

type 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 =
    let d = Dictionary()
    d.Add (1, 2)
    d.Add (3, 4)
    d

printfn "%A" dd
dd.GetOrAdd (5, (fun x -> 2 * x)) |> printfn "%A :: %d" dd
dd.GetOrAdd (5, (fun x -> 9 * x)) |> printfn "%A :: %d" dd

:

seq [[1, 2]; [3, 4]]
seq [[1, 2]; [3, 4]; [5, 10]] :: 10
seq [[1, 2]; [3, 4]; [5, 10]] :: 10

-

, @JoelMueller :

type IDictionary<'TKey, 'TValue> with
    member this.GetOrAdd (key:'TKey, fun':'TKey -> 'TValue) =
        match this.TryGetValue key with
          | true, val' -> val'
          | false, _   -> let val' = fun' key
                          this.Add (key, val')
                          val'
+8

All Articles