2010-07-23 35 views
6

Khi gỡ lỗi ứng dụng F #, tôi muốn có thể gọi phương thức F # từ cửa sổ ngay lập tức VS2010 nhưng có vẻ như không hoạt động. Vấn đề dường như là các phương thức F # thực sự là các đối tượng FSharpFunc. Tôi đã thử sử dụng phương thức "Gọi" nhưng cửa sổ tương tác không nhận ra nó.Làm cách nào để gọi hàm F # từ cửa sổ ngay lập tức VS2010

+0

Tôi đã gửi đề xuất trong MS Connect về điều này vài ngày trước: https://connect.microsoft.com/VisualStudio/feedback/details/574242/f-debugger-support –

+0

Điều này dường như chỉ là vấn đề nếu bạn có một hàm với một đối số duy nhất. Tôi có thể gọi một hàm với nhiều đối số (curried) trực tiếp từ cửa sổ ngay lập tức với cú pháp giống như C# –

Trả lời

9

Tích hợp F # cho Visual Studio không hỗ trợ biểu thức F # trong cửa sổ ngay lập tức (hoặc đồng hồ), do đó, tùy chọn duy nhất là viết mã C# tương ứng với biểu diễn được biên dịch mà F # sử dụng. Tôi đã thử làm điều đó và tôi đang có cùng một vấn đề như bạn mô tả - phương pháp Invoke dường như có (trong Reflector), nhưng Visual Studio không muốn gọi nó trực tiếp. Tôi đã thử sử dụng ví dụ sau:

let foo f = 
    let n = f 1 2 // Breakpoint here 
    n + 1 

Tuy nhiên, có nhiều cách khác để gọi hàm. Trong trường hợp này, mã thực tế được tạo bởi trình biên dịch F # là một cuộc gọi đến phương thức InvokeFast. Nếu bạn gõ như sau vào cửa sổ ngay lập tức, nó hoạt động:

Microsoft.FSharp.Core.FSharpFunc<int, int>.InvokeFast<int>(f, 1, 2) | 

Nó cũng xuất hiện rằng bạn có thể gọi thông thường Invoke phương pháp sử dụng dynamic từ C# 4.0 (chứng minh rằng phương pháp này thực sự là có!):

((dynamic)f).Invoke(1, 2) 

Điều này chỉ hoạt động nếu bạn thêm tham chiếu đến Microsoft.CSharp.dll (và sử dụng một số loại được xác định trong hội đồng ở đâu đó trong mã của bạn - ví dụ như chú thích - để nó được tải).

+0

Ok, điều này đã làm việc! Tôi đã thử InvokeFast tĩnh nhưng tôi đã không nhận ra rằng tôi cần thiết để buộc tải Microsoft.CSharp. Sử dụng động là khá thông minh;) –

+0

Chỉ cần làm rõ - phương pháp 'InvokeFast' sẽ hoạt động mà không có' Microsoft.CSharp.dll' (mặc dù có thể cần phải làm gì đó để cửa sổ ngay lập tức tải 'FSharp.Core.dll'). Thư viện C# chỉ cần cho 'dynamic'. –

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