F#调用含重载的C# API时如何指定选择目标重载而非params数组重载?
问题解决:F# 调用C#含params重载的API匹配错误
核心原因
- F# 默认不会将匿名函数隐式转换为
Expression<Func<T>>类型,直接传入lambda时编译器无法识别匹配带表达式参数的重载 params object[]重载可接收任意类型任意数量的参数,重载解析优先级更高,因此会被错误命中
可用解决方案
- 方法1:提前显式声明lambda的目标类型
// 显式标注表达式类型 let expr : Expression<Func<int>> = fun () -> 3 let result = S.Foo(expr, "")
- 方法2:调用时直接对lambda做类型转换
let result = S.Foo(fun () -> 3 :> Expression<Func<int>>, "")
- 方法3:显式指定参数名,让编译器直接定位到目标重载
// 指定参数名后不存在重载匹配歧义 let result = S.Foo(expression = fun () -> 3, gg = "")
- 方法4:如果不需要传递可选参数,直接省略可选参数即可降低匹配歧义
let result = S.Foo(fun () -> 3 :> Expression<Func<int>>)
内容的提问来源于stack exchange,提问作者Asik
相关产品推荐
相关产品推荐

