F# - тип int не совместим с типом unit

совершенно новый для функциональных языков, но я поддерживаю чужой код с большим количеством F#. Может ли кто-нибудь дать некоторое представление об этом?

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

MTViewer.ImageViewer имеет тип System.Окна.Контроли.Изображение и сетка-это система.Окна.Контроли.Сетка.

опять же, ошибка: тип int несовместим с типом unit

2 ответов


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

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

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

то, что, вероятно, происходит, является одним из следующих

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

для последних 2 случаев вы можете исправить это, передав значение в ignore функции

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

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

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

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

let mtvCap = Rendering.MTViewerCapture(mtViewer)