如何为 F# 接口编写事件成员?

How to write an Event member for an F# interface?

我是 F# 新手。在 C# 中,我有一个接口定义为:

public interface IMenuEvents
   {
       event Action SaveEvent;
       event EventHandler<ParagraphReadyEventArgs> ParagraphReadyEvent;

       ....
   }

哪里

public class ParagraphReadyEventArgs : System.EventArgs
    {
        public ParagraphReadyEventArgs(string paragraph_title)
        {
            ParagraphTitle = paragraph_title;
        }

        public string ParagraphTitle { get; }
    }

IMenuEvents接口是怎么用F#写的?

感谢您的帮助。

给定的声明转换为

open System

type ParagraphReadyEventArgs(paragraphTitle: string) =
    inherit EventArgs()
    member val ParagraphTitle = paragraphTitle

type IMenuEvents =
    [<CLIEvent>]
    abstract member SaveEvent : IDelegateEvent<EventHandler>

    [<CLIEvent>]
    abstract member ParagraphReadyEvent : IDelegateEvent<EventHandler<ParagraphReadyEventArgs>>

主要区别在于 EventHandler 包裹在 IDelegateEvent<T>

在幕后,您将获得与使用 C# 可以获得的相同界面。 Decompilation

我不明白为什么 F# 选择让事情变得如此复杂。希望有人能回答这个问题

关于原始设计的几句话:建议所有事件的类型为EventHandlerEventHandler<TEventArgs>,不要使用自定义事件类型。如果您担心 EventArgs 的内存分配,请使用 EventArgs.Empty 而不是 new EventArgs()