为何编译器可推断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
相关产品推荐
相关产品推荐

