F # - тип int не совместим с типом unit - PullRequest
7 голосов
/ 17 августа 2010

Совершенно новый для функциональных языков, но я поддерживаю чужой код с большим количеством 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

Ответы [ 2 ]

14 голосов
/ 17 августа 2010

F # не позволяет вам игнорировать возвращаемые значения.Тип unit является версией F # void.Таким образом, ошибка говорит по существу

Я ожидал, что оператор не будет возвращен, но вместо этого он возвращает значение типа int

Или наоборот.Я склонен неправильно читать это сообщение об ошибке.

Вероятно, произойдет одно из следующих действий:

  1. Рассматриваемый метод ожидает возвращаемого значения int, но метод Add возвращает void, поэтому F # просто запрашиваетвозвращаемое значение
  2. Метод, о котором идет речь, набирается как unit, но Add возвращает int, и F # требует, чтобы вы проигнорировали значение.
  3. GetCapture или ToWpfImage возвращают значения, которые необходимо явно обработать.

В последних 2 случаях это можно исправить, передав значение в ignorefunction

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

После небольшого разбора я считаю, что проблема # 2 в том, что UIElementCollection.Add возвращает значение int.Попробуйте изменить последнюю строку так, чтобы она выглядела так:

grid.Children.Add(mtvCap.ImageElement) |> ignore
1 голос
/ 17 августа 2010

Я очень мало знаю о F #, но, насколько я помню, «unit» - это их способ сказать «void», поэтому я предполагаю, что вы пытаетесь присвоить «возвращаемое значение» функции, котораяУ него есть один, чтобы сделать его пригодным для жизни.Это будет наиболее вероятный кандидат, эта строка:

let mtvCap = Rendering.MTViewerCapture(mtViewer)

...