2010-08-17 15 views
7

Bastante nuevo en lenguajes funcionales, pero estoy manteniendo el código de otra persona con un montón de F #. ¿Alguien puede dar una idea de esto?F # - El tipo int no es compatible con la unidad de tipo

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

MTViewer.ImageViewer es de tipo System.Windows.Controls.Image, y la rejilla es System.Windows.Controls.Grid.

Una vez más, el error es: El tipo int no es compatible con la unidad de tipo

+4

Bravo! La mayoría de los desarrolladores habrían perdido el tiempo reescribiendo. Me alegra ver que estás haciendo lo correcto: aprender la tecnología. – pblasucci

Respuesta

14

F # no permite hacer caso omiso de los valores de retorno en silencio. El tipo unit es la versión de F # de void. Así que el error está diciendo esencialmente

que esperaba la declaración de no tener retorno, sino que devuelve un valor int

o lo contrario. Tiendo a leer incorrectamente este mensaje de error.

lo que probablemente suceda es uno de los siguientes

  1. El método en cuestión está a la espera de un valor int vuelta, pero el método Add regresa vacía, por tanto, F # está solamente pidiendo un valor de retorno
  2. El método en cuestión está escrito como unit pero Add está devolviendo un int y F # necesita que ignore el valor.
  3. El GetCapture o ToWpfImage devuelven valores que deben manejarse explícitamente.

Durante los últimos 2 casos se puede solucionar este pasando el valor de la función ignore

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

Después de cavar alrededor de un pedacito creo # 2 es el tema porque UIElementCollection.Add devuelve un valor int. Intente modificar la línea final para que se vea así

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

Sí, parece ser exactamente eso, gracias. – mkocubinski

1

sé muy poco acerca de F #, pero por lo que recuerdo, "unidad" es su forma de decir "vacío", por lo que estoy adivinará que está tratando de asignar el "valor de retorno" de una función que no tiene uno, a un varaible. Eso haría que el candidato más probable, esta línea:

let mtvCap = Rendering.MTViewerCapture(mtViewer)

+0

La respuesta es técnicamente correcta, pero es probable que desee ir con la solución de JaredPar si no está interesado en el resultado de la devolución (como parece ser el caso aquí). – Robert

Cuestiones relacionadas