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

为何编译器可推断Bind中Match的返回类型,却无法推断Map的?

为什么Bind能自动推断Match的泛型返回类型,Map却不行?

先看核心的Match方法定义:

public TR Match<TR>(Func<Exception, TR> Exception, Func<T, TR> Success)

编译器需要为TR找到一个共同类型,让传入的两个lambda表达式都能返回可转换为TR的值。

1. Bind里的类型推断为啥能成

在Bind的Match调用中:

  • 第一个分支ex => ex:返回的是Exception类型,而Exceptional<R>有隐式转换运算符,可直接将Exception转为Exceptional<R>
  • 第二个分支t => f(t).Run():f(t)返回Try<R>,调用Run()后直接输出Exceptional<R>类型

两个分支最终的实际返回类型都是Exceptional<R>,编译器可以直接确定TR就是该类型,因此无需显式指定。

2. Map里的类型推断为啥卡壳

在Map的Match调用中:

  • 第一个分支ex => ex:直接返回Exception类型
  • 第二个分支t => f(t):直接返回R类型

编译器需要找一个TR,让Exception和R都能转换为它。虽然我们知道Exceptional<R>可以通过隐式转换接收这两种类型,但C#的类型推断规则不会自动通过隐式转换来推导泛型参数——它只会优先检查lambda的直接返回值类型,而Exception和任意泛型类型R没有天然的共同基类或转换关系,编译器无法自动联想到要借助Exceptional<R>的隐式转换来统一类型,因此必须手动指定Match<Exceptional<R>>。


内容的提问来源于stack exchange,提问作者user16095727

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 23:25:19