我正在为 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...
),错误就会消失。这就是我现在正在使用的解决方法,但我想更多地了解这个问题以及是否可以修复它,以便扩展的用户可以正常使用重载方法。
我可以想象 F# 中的反射定义不支持重载方法,并且不能仅通过参数的数量来区分方法(我无法检查,因为我没有Expr.TryGetReflectedDefinition
在 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# 反射定义的错误还是不可避免的限制?有可能修复它吗?
非常感谢您的帮助!