首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用TryParse解决过载问题

用TryParse解决过载问题
EN

Stack Overflow用户
提问于 2019-03-13 20:23:12
回答 1查看 110关注 0票数 7

我们有一个函数,将像Int32.TryParse这样的东西从使用byref转换为使用返回值的选项。

代码语言:javascript
复制
let inline ToOptionFunc refFunction x =
    match refFunction x with
    | true, value  -> Some value
    | false, _     -> None

这样的东西停止了在.NET内核中编译新的重载到TryParse:

代码语言:javascript
复制
let Int32TryParse (x:string) =
     ToOptionFunc Int32.TryParse x // A unique overload for method 'TryParse' could not be determined (...)

我尝试了很多事情,却意外地把它写成这样:

代码语言:javascript
复制
let Int32TryParse (x:string) =
     x |> ToOptionFunc Int32.TryParse

我只是不明白为什么这会编译,而前者则不会。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-13 21:13:45

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

  • 在没有管道的版本中,编译器需要键入检查ToOptionFunc Int32.TryParse x.它从左到右,当它到达Int32.TryParse时,它还不知道x (它有一个将其限制为string的类型注释),而且如果不知道x,它就无法知道您需要哪个TryParse
  • 在有管道的版本中,编译器需要键入检查x |> ToOptionFunc Int32.TryParse.从左到右,它知道xstring,因此它推断传递给ToOptionFunc的函数也必须使用string --当它检查Int32.TryParse时,它已经可以唯一地确定重载。

总结是,管道有很好的性能指导类型检查!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55150600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档