F# - 类型 int 与类型 unit 不兼容。

7

我对函数式语言还比较陌生,但是我正在维护一些使用大量F#代码的项目。有人能给我提供一些见解吗?

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

MTViewer.ImageViewer的类型是System.Windows.Controls.Image,grid是System.Windows.Controls.Grid。

错误信息为:类型int与类型unit不兼容。


4
太棒了!大多数开发者可能会浪费时间重新编写,很高兴看到你正在做正确的事情:学习技术。 - pblasucci
2个回答

14

F#不允许你忽略返回值。类型unit是F#版本的void。因此这个错误基本上是在说:

我期望语句没有返回值,但它返回了一个int值。

或者恰恰相反。我经常会错误地读取这个错误消息。

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

  1. 相关方法需要返回一个int值,但方法Add返回了void,因此F#只是要求返回值。
  2. 相关方法被定义为unit,但Add返回了int,因此F#需要你忽略该值。
  3. GetCaptureToWpfImage返回的值需要明确处理。

对于后两种情况,你可以通过将该值传递给ignore函数来解决此问题。

mtvCap.GetCapture() |> ignore
mtvCap.ToWpfImage() |> ignore
grid.Children.Add(mtvCap.ImageElement) |> ignore

经过一番挖掘,我认为问题在于 #2,因为 UIElementCollection.Add 返回一个int值。尝试将最后一行修改为以下内容:

grid.Children.Add(mtvCap.ImageElement) |> ignore

1
我对F#知之甚少,但据我所记,“unit”是他们说“void”的方式,因此我猜测您正在尝试将没有返回值的函数的“返回值”分配给一个变量。这使得最有可能的候选者是这一行: let mtvCap = Rendering.MTViewerCapture(mtViewer)

答案在技术上是正确的,但如果您不关心返回结果(似乎在这种情况下是这样),您可能希望选择JaredPar的解决方案。 - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接