使用命名参数调用Dictionary
的{{1}}方法在F#中有效。
Add()
在Polly的let d = Dictionary<string, obj>()
d.Add(key = "five", value = 5)
let d2= Dictionary<obj, obj>()
d2.Add(key = "five", value = 5)
d2.Add(key = 5, value = 5)
类中,有一个类似的Context
方法,具有2个重载:
Add()
我可以通过所有这些方式使用它:
Add(key: obj, value: obj) : unit
Add(key: string, value: obj) : unit
但不是这样,它说它无法在重载之间进行解析,需要类型注释。
let c = Polly.Context()
c.Add("five", 5)
c.Add(5, 5)
c.Add(key = 5, value = 5)
那是为什么,我该如何解决?
答案 0 :(得分:2)
编译器无法计算出要使用的方法。通常在使用F#处理C#和OO样式时,这种情况更为常见。我不介意,在功能上保持诚实。
现在解决问题最直接的方法是使用:
c.Add(key = ("five" :> obj), value = 5)
通过强制转换,类型是什么都没有歧义,编译器很高兴。
或者,您可以创建具有显式类型的函数,这也将帮助编译器弄清楚该函数。如果您经常使用此工具,我建议这样做:
let addToPolly (ctx:Polly.Context) (k:obj) (v:obj) =
ctx.Add(k,v)
ignore()
addToPolly c "five" 5
更新:正如@brett指出的,我已经推断出答案,但没有明确指出。这是一些让编译器满意的示例。
let pollyAddAsString (ctx:Polly.Context) (k:string) (v:obj) = ctx.Add(key = k, value = v) |> ignore
let pollyAddAsObj (ctx:Polly.Context) (k:obj) (v:obj) = ctx.Add(key = k, value = v) |> ignore
pollyAddAsObj c "five" 5
pollyAddAsString c "five" 5
let (k:string,v:obj) = ("five", 5 :> obj)
let (x:obj,y:obj) = ("five" :> obj, 5 :> obj)
c.Add(key = k, value = v)
c.Add(key = x, value = y)