在此代码中,EventL使用let绑定,而EventM(尝试使用)成员:

type MyType() =
   let EventL = new Event<_>()
   member this.EventM = new Event<_>()

   member this.AddHandlers() =
      Event.add (fun string1 -> printfn "EventL: %s" string1) EventL.Publish
      Event.add (fun string1 -> printfn "EventM: %s" string1) this.EventM.Publish

   member this.Trigger(message) =
      EventL.Trigger(message)
      this.EventM.Trigger(message)

let myMyType = MyType()
myMyType.AddHandlers()
myMyType.Trigger("Event arg.")

运行时,仅输出EventL: Event arg.,而未调用EventM的处理程序。

我是在犯一个愚蠢的错误还是缺少一些有关成员的逻辑?

最佳答案

EventM是一个计算属性,每次调用时都会对其进行评估。这将导致在其余的代码中创建不同的Event对象(两次,两次在AddHandlers中,第二次在Trigger中)。

签出member val语法。这创建了一个后备领域,但仍然提供了公共可访问性。

固定版本为:

type MyType() =
    member val EventM = new Event<_>()

如果没有主构造函数,则需要使用val并将其分配给构造函数:
type MyType =
    val EventM : Event<string>
    new () = { EventM = new Event<_>() }

请注意,在这种情况下,必须将type参数赋予Event

10-07 16:05