gpt4 book ai didi

在 F# 中触发时未调用 C# 事件处理程序

转载 作者:行者123 更新时间:2023-12-03 23:42:22 25 4
gpt4 key购买 nike

我正在努力将事件从用 F# 编写的类中暴露给 C#。当使用 let 绑定(bind)定义事件时,这没有问题:

let myFSharpEvent = new Event<EventArgs>()

[<CLIEvent>]
member this.FSharpEvent = myFSharpEvent.Publish

member this.RaiseFSharpEvent e = myFSharpEvent.Trigger e
但是当事件被定义为私有(private)成员时,它正在编译,但在运行时添加的事件处理程序没有被执行。
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 绑定(bind),因为在我的实际场景中,我的类继承自一个用 C# 编写的类,并且不仅有一个默认构造函数,还有一个我需要的复制构造函数和反序列化构造函数覆盖。
所以问题是:为什么 let 绑定(bind)有效,但成员 private 没有。

最佳答案

我喜欢使用 SharpLab.io 快速查看一些 F# 是如何编译为 c# 的。

//Your F#
let myFSharpEvent = new Event<EventArgs>()

//To c#
internal FSharpEvent<EventArgs> myFSharpEvent;

-----------

//Your F#
member private this.myFSharpEvent = new Event<EventArgs>()

//To c#
internal FSharpEvent<EventArgs> myFSharpEvent
{
get
{
return new FSharpEvent<EventArgs>();
}
}

您可以看到,每次调用私有(private)版本时,都会得到一个新的事件处理程序,然后将其丢弃给 GC。
我在 F# 中也发现典型的 OO 东西令人困惑,但我认为主要模式是使用 let 绑定(bind)作为支持字段并用成员绑定(bind)包装它们:
https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/members/let-bindings-in-classes

关于在 F# 中触发时未调用 C# 事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64989902/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com