FunScript プロジェクト (F# から Javascript コンパイラーへ) のいくつかの拡張機能を作成しています。興味がある場合は、ここでソースを見つけることができます。
Tomas Petricekによる AwaitObservable 拡張機能をエミュレートしようとしていました。ただし、オーバーロードされたメソッドを使用AwaitObservable(w), AwaitObservable(w1,w2)...
すると、プロジェクトを Javascript にコンパイルしようとすると、次のエラーが発生します。
An unhandled exception of type 'System.Reflection.AmbiguousMatchException' occurred in FSharp.Core.dll
Additional information: Ambiguous match found.
FunScript は、反映された定義のキャッシュ ディクショナリをプロジェクトに保持します。このエラーは、 を使用してキャッシュに新しい定義を追加しようとすると発生しExpr.TryGetReflectedDefinition
ます。オーバーロード ( ) の代わりに別の名前を使用すると、エラーは消えますAwaitObservable2, AwaitObservable3...
。それが私が現在使用している回避策ですが、拡張機能のユーザーがオーバーロードされたメソッドを正常に使用できるように、問題とそれを修正できるかどうかについて詳しく知りたいです。
Expr.TryGetReflectedDefinition
F# の Reflected Definitions はオーバーロードされたメソッドをサポートしておらず、引数の数だけでメソッドを区別できないことが想像できます ( fsharp GitHub ソース リポジトリでの実装が見つからなかったため、確認できませんでした)。ただし、私を困惑させているのは、 AwaitObservable を探しているときにエラーが発生しないことですが、次の方法です。
{System.IDisposable System-IObservable
1-Subscribe(System.IObserver
1[FunScript.TypeScript.MouseEvent])} System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
だから私の質問は:
- の代わりに
Expr.TryGetReflectedDefinition
失敗するのはなぜですか?IObservable.Subscribe
Async.AwaitObservable
Expr.TryGetReflectedDefinition
None を返す代わりに例外をスローするのはなぜですか?- これは F# Reflected Definitions のバグですか、それとも避けられない制限ですか? それを修正することは可能ですか?
ご協力いただきありがとうございます。