【问题标题】:TryParse String to Int Active PatternsTryParse 字符串到 Int 活动模式
【发布时间】:2019-03-29 10:07:34
【问题描述】:

您好,我目前正在尝试使用活动模式和 Int.TryParse 方法将字符串解析为 Int。使用 2012 年的旧示例,它曾经像这样工作:

let (|Int|_|) str =
    match System.Int32.TryParse str with
    | true,int -> Some int
    | _ -> None

但现在我收到一条错误消息,告诉我无法选择正确的 TryParse() 重载。将 str 注释为字符串,错误仍然存​​在。我希望你们中的任何人都可以帮助我解决这个简单的问题,在此先感谢。

一些附加信息:我正在尝试使用 FSharp.Core 4.5.2 和 .Net Core 2.1。

错误:

FS0041 无法确定方法“TryParse”的唯一重载 基于此程序点之前的类型信息。一种 可能需要注释。候选人: Int32.TryParse(s: ReadOnlySpan, 结果: byref) : bool, Int32.TryParse(s: 字符串,结果:byref) : bool

【问题讨论】:

  • 您是否在编译器输出的文本中或在 Visual Studio“错误列表”选项卡中看到错误?有时我会在“错误列表”选项卡中看到虚假结果,这可能是由编辑器内解析问题引起的。您的代码在我的一个开放项目中编译得很好。
  • 我在“错误列表”选项卡中看到它,但编译器输出中也显示了相同的消息。它不编译。

标签: f#


【解决方案1】:

Span 类型最近被引入 .Net。

这是类型推断和重载函数的一个缺点:它会破坏现有代码。类型注释是解决方案。

【讨论】:

    【解决方案2】:

    考虑使用更惯用的 F# 内置 int 函数。

    有点像...

    let tryParseInt s = 
        try 
            s |> int |> Some
        with :? FormatException -> 
            None
    

    【讨论】:

    【解决方案3】:

    在 Reddit 上 Jestar342 的帮助下发现了我自己的错误:

    let (|Int|_|) (str:string) =
        match System.Int32.TryParse str with
        | true,int -> Some int
        | _ -> None
    

    将 str 更改为 (str:string) 可修复此错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2011-08-09
      相关资源
      最近更新 更多