如何在F#中构造对应String.Equals双参数重载的Func?
问题分析与解决
你的问题出在F#对C#实例方法组的类型推断逻辑上——和C#自动匹配Func重载的行为不同,F#在处理多参数的实例方法组时,无法自动识别你想要绑定的string.Equals(string, StringComparison)重载。
当你写Func<string, StringComparison, bool>(s.Equals)时,F#会尝试解析s.Equals的重载,但因为存在Equals(object, StringComparison)这类重载,类型推断无法确定你要的是哪个版本,最终错误地将其解析为已执行的方法调用(返回bool值),而非方法组,这就导致了类型不匹配的错误。
而单参数版本能正常运行,是因为目标类型Func<string, bool>可以明确匹配string.Equals(string)的重载,类型推断没有歧义。
解决方法
方法一:用F# lambda表达式(最惯用写法)
直接用lambda包裹调用,完全绕开方法组的类型推断问题,这也是F#里更自然的实现方式:
let makeEquals (s: string) : string -> StringComparison -> bool = fun other comp -> s.Equals(other, comp)
方法二:明确指定重载(保留Func转换的写法)
如果你一定要沿用Func和FuncConvert的写法,可以通过lambda明确参数类型,让F#能正确匹配目标重载:
open System open System.Linq.Expressions let makeEquals (s: string) : string -> StringComparison -> bool = let f = Func<string, StringComparison, bool>(fun other comp -> s.Equals(other, comp)) FuncConvert.FromFunc(f)
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

