2010-08-17 5 views
7

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

 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 не совместим с блоком типа

+4

Bravo! Большинство разработчиков потеряли бы время перезаписи. Я рад видеть, что вы поступаете правильно: изучая технологию. – pblasucci

ответ

14

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

Я ожидал, что заявление не имеет никакого возврата, но вместо этого он возвращает целочисленное значение

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

Что, вероятно, происходит это одна из следующего

  1. Метода в вопросе ожидает int возвращаемого значения, но метод Add возвращает пустой, следовательно, 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 
+0

Да, похоже, именно это, спасибо. – mkocubinski

1

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

let mtvCap = Rendering.MTViewerCapture(mtViewer)

+0

Ответ технически корректен, но вы, вероятно, захотите пойти с решением JaredPar, если его не интересует результат возврата (как это выглядит здесь). – Robert

Смежные вопросы