首页 > 解决方案 > 使用 TryParse 进行重载解析

问题描述

我们有一个函数将诸如Int32.TryParse从使用 byref 转换为使用 Option 作为返回值之类的东西。

let inline ToOptionFunc refFunction x =
    match refFunction x with
    | true, value  -> Some value
    | false, _     -> None

像这样的东西停止在 .NET Core 中编译,并带有 TryParse 的新重载:

let Int32TryParse (x:string) =
     ToOptionFunc Int32.TryParse x // A unique overload for method 'TryParse' could not be determined (...)

我尝试了很多东西,却意外地通过这样写来让它工作:

let Int32TryParse (x:string) =
     x |> ToOptionFunc Int32.TryParse

我只是不明白为什么这个编译而前者没有。

标签: f#

解决方案


在 .NET Core 中,该Int32.TryParse函数有一些额外的重载——它可以解析string或解析ReadOnlySpan<char>. 原始代码停止工作,因为编译器不知道您要使用哪个重载。

  • 在没有管道的版本中,编译器需要进行类型检查ToOptionFunc Int32.TryParse x。它从左到右进行,当它到达时Int32.TryParse,它还不知道x(它有一个类型注释将它限制为string),并且不知道x,它不知道TryParse你需要哪个。

  • 在带有管道的版本中,编译器需要进行类型检查x |> ToOptionFunc Int32.TryParse。它从左到右进行并知道xstring,因此它推断传递给的函数ToOptionFunc也必须是string- 当它检查时Int32.TryParse,它已经可以唯一地确定重载。

总结是,管道具有非常好的指导类型检查的属性!


推荐阅读