You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:33:22