F # - тип INT не совместим с блоком типа
Вопрос
Довольно новое на функциональные языки, но я поддерживаю чужой код с большим количеством 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 не совместим с блоком типа
Решение
F # не позволяет вам молча игнорировать возвратные значения. Тип unit
это версия f # void
. Отказ Поэтому ошибка говорит по сути
Я ожидал, что заявление не будет возврата, но вместо этого он возвращает значение int
Или обратное. Я склонен неправильно прочитать это сообщение об ошибке.
Что, вероятно, происходит одно из следующих
- Рассматриваемый метод ожидает
int
возвращаемое значение, но методAdd
Возвращает void, следовательно, f # просто просит возвратный стоимость - Рассматриваемый метод набирается как
unit
ноAdd
возвращает АНint
и f # нуждается в вас игнорировать значение. - То
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 #, но, как я помню, «единица» - это их способ сказать «пустота», поэтому я догадаюсь, что вы пытаетесь назначить «возвращаемое значение» функции, которая не имеет одного , к варианту. Это сделало бы наиболее вероятным кандидатом, эта линию:
let mtvCap = Rendering.MTViewerCapture(mtViewer)