2010-08-17 3 views
7

Tout nouveau pour les langages fonctionnels, mais je conserve le code de quelqu'un d'autre avec beaucoup de F #. Quelqu'un peut-il offrir un aperçu de cela?F # - Le type int n'est pas compatible avec l'unité de type

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

MTViewer.ImageViewer est de type System.Windows.Controls.Image, et la grille est System.Windows.Controls.Grid.

Encore une fois, l'erreur est la suivante: Le type int est pas compatible avec l'unité de type

+4

Bravo! La plupart des développeurs auraient perdu du temps à réécrire. Je suis content de voir que vous faites ce qu'il faut: apprendre la technologie. – pblasucci

Répondre

14

F # ne permet pas pour vous d'ignorer silencieusement les valeurs de retour. Le type unit est la version F # de void. Donc, l'erreur dit essentiellement

I expected la déclaration d'avoir pas de retour mais elle retourne une valeur int

Ou le contraire. J'ai tendance à lire incorrectement ce message d'erreur.

Ce qui est probable qui se passe est une des façons suivantes

  1. La méthode en question s'attend à une valeur de retour int mais la méthode Add retourne void où F # est tout simplement demander une valeur de retour
  2. La méthode en question est tapé unit mais Add renvoie int et F # a besoin de vous pour ignorer la valeur.
  3. Les valeurs GetCapture ou ToWpfImage renvoient des valeurs qui doivent être gérées explicitement.

Pour les 2 derniers cas, vous pouvez corriger cela en passant la valeur à la fonction ignore

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

Après avoir creusé autour d'un peu je crois # 2 est la question parce que UIElementCollection.Add retourne une valeur int. Essayez de modifier la dernière ligne pour ressembler à ceci:

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

Oui, semble être exactement cela, merci. – mkocubinski

1

Je sais remarquablement peu F #, mais je me souviens bien, « unité » est leur façon de dire « vide », donc je suis va deviner que vous essayez d'assigner la "valeur de retour" d'une fonction qui n'en a pas, à un varaible. Cela rendrait le candidat le plus probable, cette ligne:

let mtvCap = Rendering.MTViewerCapture(mtViewer)

+0

Réponse est techniquement correcte, mais vous voulez probablement aller avec la solution de JaredPar si vous n'êtes pas intéressé par le résultat de retour (comme cela semble être le cas ici). – Robert

Questions connexes