2010-08-17 45 views
7

Khá mới đối với các ngôn ngữ chức năng, nhưng tôi đang duy trì mã của người khác với nhiều F #. Bất cứ ai có thể cung cấp một số cái nhìn sâu sắc vào điều này?F # - Loại int không tương thích với loại đơn vị

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

MTViewer.ImageViewer thuộc loại System.Windows.Controls.Imrid và lưới là System.Windows.Controls.Grid.

Một lần nữa, lỗi là: kiểu int là không tương thích với loại đơn vị

+4

Bravo! Hầu hết các nhà phát triển sẽ lãng phí thời gian viết lại. Tôi rất vui khi thấy bạn đang làm đúng: học công nghệ. – pblasucci

Trả lời

14

F # không cho phép bạn bỏ qua các giá trị âm thầm trở lại. Loại unit là phiên bản của F # void. Vì vậy, các lỗi đang nói về cơ bản

tôi dự kiến ​​báo cáo kết quả không có lợi nhuận mà thay vào đó nó sẽ trả về một giá trị int

Hoặc ngược lại. Tôi có xu hướng đọc sai thông báo lỗi này.

gì có thể xảy ra là một trong những

  1. Các phương pháp sau đây trong câu hỏi dự kiến ​​giá trị int trở lại nhưng phương pháp Add trả về void do đó F # là chỉ yêu cầu cho một giá trị trả về
  2. Phương pháp trong câu hỏi được nhập là unit nhưng Add đang trả về số int và F # cần bạn bỏ qua giá trị.
  3. Giá trị trả về GetCapture hoặc ToWpfImage cần được xử lý rõ ràng.

Đối với 2 trường hợp cuối cùng bạn có thể sửa lỗi này bằng cách thông qua các giá trị cho các ignore chức năng

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

Sau khi đào bới xung quanh một chút tôi tin rằng # 2 là vấn đề vì UIElementCollection.Add trả về một giá trị int. Hãy thử sửa đổi dòng cuối cùng để trông giống như thế này

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

Vâng, có vẻ chính xác, cảm ơn bạn. – mkocubinski

1

Tôi biết khá ít về F #, nhưng khi tôi gọi lại, "đơn vị" là cách họ nói "khoảng trống", vì vậy tôi sẽ đoán rằng bạn đang cố gắng gán "giá trị trả về" của một hàm không có, cho một biến thể. Điều đó sẽ làm cho các ứng cử viên có khả năng nhất, dòng này:

let mtvCap = Rendering.MTViewerCapture(mtViewer)

+0

Trả lời là chính xác về mặt kỹ thuật, nhưng bạn có thể muốn đi với giải pháp của JaredPar nếu bạn không quan tâm đến kết quả trả về (có vẻ như trường hợp ở đây). – Robert

Các vấn đề liên quan