イベントIObservable
から作成する C# コードを複製しようとしています。Button.Click
このコードを 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))
ステートメントの 2 行目を除いて、すべてが満足しています。
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
andを使用するため、F# コンパイラーは実際には正しいものです。RoutedEventArgs
C# コンパイラが舞台裏で行う魔法で、F# コンパイラでは機能しないものがありますか、それともここで何かが欠けているだけですか?
いずれにせよ、どうすればこれを F# で機能させることができますか?