2010-07-15 43 views
6

Tôi đã một giao diện, viết bằng C#, được định nghĩa như thế này:thực hiện C EventHandlers # trong F #

public interface IWidget 
{ 
    object Evaluate(); 
    event EventHandler Invalidated; 
} 

Khi tôi cố gắng thực hiện giao diện này trong F #, tôi nhìn vào những gì F # cho rằng giao diện IWidget là (bởi lơ lửng chuột của tôi trên nó), và tôi thấy

type IWidget = 
    interface 
     member Evaluate : unit -> obj 
    end 

nó dường như bỏ qua những sự kiện không còn giá trị hoàn toàn ... đây là một vấn đề được biết đến với F # và nếu như vậy là có cách nào để làm việc xung quanh nó? Khi triển khai phiên bản F # của IWidget, tôi có thể triển khai sự kiện này bên ngoài phần IWidget hay không? Có vẻ như thực sự khó chịu mà f # xử lý các "sự kiện" từ khóa quá nghèo nàn ...

UPDATE: Sau hơn nữa quan trọng xung quanh, studio sau đó đã được nói những câu như:

'không thực hiện được giao cho IWidget.remove_Invalidate (giá trị: EventHandler): đơn vị'

sau đó, khi tôi đã thêm các phương pháp đó nên toàn bộ điều trông giống như:

interface IWidget with 
    member w.Evaluate() = new obj() 
    member w.add_Invalidated(value:EventHandler) =() 
    member w.remove_Invalidated(value:EventHandler) =() 
end 

nó được biên dịch tốt, mặc dù các tooltip vẫn nói thành viên duy nhất của IWidget là Evalu ate() ... nó có vẻ giống như cách F # (hoặc ít nhất là IDE) xử lý các công cụ này thực sự là screwy ...

ANOTHER UPDATE: Theo chú giải công cụ trong IDE, thẻ [] cho phép một sự kiện được biên dịch dưới dạng sự kiện siêu dữ liệu CLI, bằng cách chuyển đổi nó thành một cặp phương thức add_/remove_ ... chỉ là FYI cho bất kỳ ai bị nhầm lẫn bởi điều này như tôi. Tóm lại, hoặc thực hiện hai phương thức đó hoặc sử dụng thẻ đó hoạt động tốt, mặc dù thực tế rằng giao diện tooltip của giao diện IWdiget thiếu bất kỳ đề cập đến sự kiện Invalidate và sự cần thiết thực hiện sự kiện như vậy chỉ được chú ý khi trình biên dịch ném một lỗi, vẫn là một lỗi rõ ràng và khá khó hiểu. Đối với bất kỳ ai tò mò, mã sau hoạt động tốt:

let invalidated = new DelegateEvent<System.EventHandler>() 

interface IWidget with 
    member w.Evaluate() = new obj() 
    [<CLIEvent>] 
    member w.Invalidated = invalidated.Publish 
end 

Cảm ơn tất cả mọi người đã giúp đỡ!

Trả lời

8

F# does support events.

Ví dụ:

let invalidated = new DelegateEvent<System.EventHandler>() 

[<CLIEvent>] 
member this.Invalidated = invalidated.Publish 
+0

thú vị ... trình biên dịch của tôi sau đó đã nói những câu như: 'không thực hiện được giao cho IWidget.remove_Invalidate (giá trị: EventHandler): đơn vị' và khi chúng tôi được gửi Vì vậy, nó trông giống như: interface IWidget with member w.Evaluate() = new obj() member w.add_Invalidated(value:EventHandler) =() member w.remove_Invalidated(value:EventHandler) =() end nó biên dịch tốt, thậm chí tho chú giải công cụ vẫn nói rằng thành viên duy nhất của IWidget được đánh giá() ... có vẻ như cách f # (hoặc ít nhất là IDE) xử lý công cụ này thực sự screwy ... – lvilnis

+0

** bỏ qua tôi là một noob ở công cụ định dạng này – lvilnis

+0

Thật không may, bạn không thể có dòng mới trong nhận xét. – SLaks

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