我正在为FunScript项目编写一些扩展(F#到Javascript编译器)。如果您感兴趣,可以找到源这里。
我试图模仿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#中的反射定义不支持重载的方法,并且不能仅仅根据参数的数量来区分方法(我无法检查这一点,因为我没有在fsharp GitHub源代码存储库中找到Expr.TryGetReflectedDefinition的实现)。然而,令我困惑的是,在查找AwaitObservable时没有发生错误,而是使用了以下方法:
{ System-IObservable
1-Subscribe(System.IObserver1FunScript.TypeScript.MouseEvent)} System.IDisposable System.Reflection.MethodBase {System.Reflection.RuntimeMethodInfo}
所以我的问题是:
Expr.TryGetReflectedDefinition在IObservable.Subscribe而不是Async.AwaitObservable中失败?Expr.TryGetReflectedDefinition要抛出一个异常而不是返回一个异常呢?提前谢谢你的帮助!
发布于 2014-09-09 08:22:09
好的,这似乎没有简单的答案,所以我会尝试回答我自己的问题。经过进一步调查..。
Async.AwaitObservable重载了存储的反射定义(这“不知何故”),无法了解实现IObservable的类型,这也是为什么他们不知道应该使用Subscribe的哪个实现。None意味着没有找到反射定义,但是这里有一个不明确的匹配,所以情况不同。CompiledName属性并为每个重载指定了不同的名称,解决了这个特殊情况下的问题。现在一切都很好:)我希望下一次我发布一个问题,这个问题实际上是可以回答的;)感谢大家花时间阅读了这篇文章。
https://stackoverflow.com/questions/25709531
复制相似问题