我很难在F#编写的类中向C#公开事件。如果使用let绑定定义事件,则没有问题:
在C#中注册并调用事件的代码如下所示:
let myFSharpEvent = new Event<EventArgs>()
[<CLIEvent>]
member this.FSharpEvent = myFSharpEvent.Publish
member this.RaiseFSharpEvent e = myFSharpEvent.Trigger e
但是,当事件被定义为私有成员时,编译是可以通过的,但在运行时添加的事件处理程序不会被执行。
member private this.myFSharpEvent = new Event<EventArgs>()
[<CLIEvent>]
member this.FSharpEvent = this.myFSharpEvent.Publish
member this.RaiseFSharpEvent e = this.myFSharpEvent.Trigger e
在C#中注册并调用事件的代码如下所示:
class Program
{
static void Main(string[] args)
{
var fsObject = new FSharpClass();
Console.WriteLine(fsObject.ToString());
fsObject.FSharpEvent += FsObject_FSharpEvent;
fsObject.RaiseFSharpEvent(EventArgs.Empty);
fsObject.FSharpEvent -= FsObject_FSharpEvent;
Console.ReadLine();
}
private static void FsObject_FSharpEvent(object sender, EventArgs args)
{
Console.WriteLine("F# event was raised.");
}
}
然而,我找不到使用let绑定的方法,因为在我的实际场景中,我的类从一个用C#编写的类继承而来,并且不仅有一个默认构造函数,还有一个拷贝构造函数和一个反序列化构造函数需要我重写。
所以问题是:为什么let绑定可以工作,但成员private却不能。