对函数式语言来说很新,但我正在使用大量 F# 维护其他人的代码。任何人都可以对此提供一些见解吗?

        let mtvCap = Rendering.MTViewerCapture(mtViewer)
        mtvCap.GetCapture()
        mtvCap.ToWpfImage()
        grid.Children.Add(mtvCap.ImageElement)

MTViewer.ImageViewer 是 System.Windows.Controls.Image 类型,网格是 System.Windows.Controls.Grid。

同样,错误是:类型 int 与类型 unit 不兼容

最佳答案

F# 不允许您静默忽略返回值。 unit 类型是 void 的 F# 版本。所以错误基本上是说



或者相反。我倾向于错误地阅读此错误消息。

可能发生的是以下情况之一

  • 有问题的方法需要 int 返回值,但 Add 方法返回 void 因此 F# 只是要求返回值
  • 有问题的方法输入为 unitAdd 返回 int 并且 F# 需要您忽略该值。
  • 需要显式处理的 GetCaptureToWpfImage 返回值。

  • 对于最后两种情况,您可以通过将值传递给ignore函数来解决此问题
    mtvCap.GetCapture() |> ignore
    mtvCap.ToWpfImage() |> ignore
    grid.Children.Add(mtvCap.ImageElement) |> ignore
    

    在深入研究之后,我相信 #2 是问题所在,因为 UIElementCollection.Add 返回一个 int 值。尝试修改最后一行看起来像这样
    grid.Children.Add(mtvCap.ImageElement) |> ignore
    

    10-07 18:36