1

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.TryGetReflectedDefinitionF# の Reflected Definitions はオーバーロードされたメソッドをサポートしておらず、引数の数だけでメソッドを区別できないことが想像できます ( fsharp GitHub ソース リポジトリでの実装が見つからなかったため、確認できませんでした)。ただし、私を困惑させているのは、 AwaitObservable を探しているときにエラーが発生しないことですが、次の方法です。

{System.IDisposable System-IObservable 1-Subscribe(System.IObserver1[FunScript.TypeScript.MouseEvent])} System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}

だから私の質問は:

  1. の代わりにExpr.TryGetReflectedDefinition失敗するのはなぜですか?IObservable.SubscribeAsync.AwaitObservable
  2. Expr.TryGetReflectedDefinitionNone を返す代わりに例外をスローするのはなぜですか?
  3. これは F# Reflected Definitions のバグですか、それとも避けられない制限ですか? それを修正することは可能ですか?

ご協力いただきありがとうございます。

4

1 に答える 1

0

わかりました、これには簡単な答えがないようですので、自分の質問に答えてみます。さらなる調査の後...

  1. オーバーロードが原因でAsync.AwaitObservable、格納された Reflected Definitions がどういうわけか (この「何とか」は説明されていないままです)、 を実装している型を追跡できなくなっているようです。そのため、どの実装を使用すべきIObservableかがわからないのです。Subscribe
  2. これは意図された動作だと思います。返さNoneれるということは、反映された定義が見つからなかったことを意味しますが、ここではあいまいな一致があったため、別のケースです。
  3. これがバグなのか「機能」なのかはまだわかりませんが、いずれにせよ、CompiledName属性を使用し、各オーバーロードに別の名前を付けて、この特定の状況で問題を修正しました。今、すべてが正常に動作します:)

次回は実際に答えられる質問を投稿したいと思います ;) 時間を割いて読んでくれた皆さんに感謝します。

于 2014-09-09T08:22:09.130 に答える