【问题标题】:Overload resolution with TryParse使用 TryParse 进行重载解析
【发布时间】:2019-03-13 20:23:12
【问题描述】:

我们有一个函数将 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

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

【问题讨论】:

  • 你为什么要转换Int32.TryParse?它已经可以像在您的第一个代码块中一样直接使用。
  • 所以它在 F# 代码中表现得更好。例如tryParse >> Option.map
  • 啊,对不起,我错过了那部分。

标签: f#


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2011-06-05
    • 2013-03-18
    • 2015-11-18
    • 2013-07-18
    相关资源
    最近更新 更多