F# - int类型与类型单位不兼容

时间:2010-08-17 16:43:57

标签: .net f# unit-type

功能语言相当新,但我用很多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类型与类型单元

不兼容

2 个答案:

答案 0 :(得分:14)

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

  

我希望语句没有返回,而是返回一个int值

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

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

  1. 有问题的方法是期望int返回值,但方法Add返回void,因此F#只是要求返回值
  2. 有问题的方法输入为unit,但Add返回int,F#需要您忽略该值。
  3. 需要明确处理的GetCaptureToWpfImage返回值。
  4. 对于最后两种情况,您可以通过将值传递给ignore函数

    来解决此问题
    mtvCap.GetCapture() |> ignore
    mtvCap.ToWpfImage() |> ignore
    grid.Children.Add(mtvCap.ImageElement) |> ignore
    

    经过深入挖掘后,我认为#2是问题,因为UIElementCollection.Add会返回int值。尝试修改最后一行看起来像这样

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

答案 1 :(得分:1)

我对F#知之甚少,但我记得,“单位”是他们说“无效”的方式,所以我猜你要试图分配一个函数的“返回值”有一个,到一个可变的。这将成为最有可能的候选人,这一行:

let mtvCap = Rendering.MTViewerCapture(mtViewer)