我正在尝试复制一些IObservable
从Button.Click
事件创建的 C# 代码。我想将此代码移植到 F#。
这是编译时没有错误的原始 C# 代码:
Observable.FromEvent<RoutedEventHandler, RoutedEventArgs>(
h => new RoutedEventHandler(h),
h => btn.Click += h,
h => btn.Click -= h))
这是我在 F# 中尝试做同样的失败的尝试:
Observable.FromEvent<RoutedEventHandler, RoutedEventArgs>(
Func<EventHandler<RoutedEventArgs>, RoutedEventHandler>(fun h -> RoutedEventHandler(h)),
Action<RoutedEventHandler>(fun h -> btn.Click.AddHandler h),
Action<RoutedEventHandler>(fun h -> btn.Click.RemoveHandler h))
除了语句的第二行之外,一切都很愉快。
F# 编译器抱怨是fun h -> RoutedEventHandler(h)
因为它不想将其h
作为RoutedEventHandler
构造函数的参数。
另一方面,C# 编译器似乎没有问题接受h => new RoutedEventHandler(h)
有趣的是,在两个代码示例(C# 和 F#)中,类型h
都是EventHandler<RoutedEventArgs>
.
我从 F# 编译器得到的错误消息是:
错误 2 此表达式的类型应为 obj -> RoutedEventArgs -> unit,但此处的类型为 EventHandler
RoutedEventHandler
我在 PresentationCore 中找到的签名是:
public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
如您所见,它确实采用object
andRoutedEventArgs
作为参数,因此 F# 编译器实际上是正确的。
C# 编译器是否有一些魔法在幕后完成了 F# 编译器没有的工作,或者我只是在这里遗漏了一些东西?
无论哪种方式,我怎样才能在 F# 中完成这项工作?