2009-02-15 40 views
6

Tôi không có bất kỳ kinh nghiệm nào trong F # nhưng có một vài dòng mã thử nghiệm trong C# cho một khuôn khổ mà tôi đã thực hiện mà tôi cần phải viết lại trong F #.Sự kiện và đại biểu trong F #

Mọi trợ giúp sẽ được đánh giá cao.

bar.Ready += new Agent.ReadyHandler(bar_Ready);    

    static void bar_Ready(string msg) 
    {  
     Console.WriteLine(msg.body); 
    } 

Trả lời

4

Tôi đã chơi rất nhiều với điều này và đây là mã hoạt động.

bar.add_Ready(fun msg -> Console.WriteLine(msg)) 

Tôi không biết làm thế nào về mặt lý thuyết chính xác nhưng nó hoạt động tốt.

Có thể bất kỳ ai xác nhận điều đó là chính xác không?

+1

Xin chào, điều này là chính xác. Unfortunatelly F # không hoạt động tốt cho tất cả các đại biểu. Tôi nghĩ rằng nếu đại biểu của bạn theo mẫu tiêu chuẩn .NET (XyzEventHandler lấy đối tượng và XyzEventArgs) thì các giải pháp được mô tả ở trên cũng sẽ hoạt động. –

+0

BTW: Nếu bạn là tác giả của loại đại biểu và bạn chỉ muốn sử dụng nó từ F #, bạn có thể cân nhắc việc sử dụng các hàm thay vì các đại biểu. –

+0

@Tomas Petricek: Khung chính nơi đại biểu đến từ C#. – Ali

6

Hãy thử điều này -

bar.Ready.AddHandler(new Agent.ReadyHandler (fun sender msg -> System.Console.WriteLine(msg))) 
+0

hoặc thậm chí ngắn hơn: bar.Ready.AddHandler (người gửi thư vui vẻ -> System.Console.WriteLine (msg)) –

+0

Lưu ý rằng các đại biểu trong F # không thêm phương thức 'BeginInvoke' và 'EndInvoke'. –

+1

Cùng ở đây tôi nhận được: "Sự kiện 'Sẵn sàng có loại đại biểu không chuẩn và phải được truy cập bằng cách sử dụng phương thức add_Ready và remove_ready rõ ràng cho sự kiện.", Có ý tưởng nào không? – Ali

9

Chỉ cần làm rõ - phiên bản ngắn hơn nên chính xác:

bar.Ready.Add(fun msg -> System.Console.WriteLine(msg)) 

Vì F # không tự động chuyển đổi chức năng lambda để các đại biểu - nhưng có phương thức Thêm có chức năng. Điều này có thể được viết thậm chí đơn giản như sau:

bar.Ready.Add(System.Console.WriteLine) 

Vì F # cho phép bạn sử dụng các thành viên .NET làm hàm hạng nhất.

+1

Tôi nhận được lỗi: Sự kiện 'Sẵn sàng có loại đại biểu không chuẩn và phải được truy cập bằng cách sử dụng phương thức add_Ready và remove_ready rõ ràng cho sự kiện. – Ali

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