Reflection F#Expr.TryGetReflectedDefinition与重载方法

Reflection F#Expr.TryGetReflectedDefinition与重载方法,reflection,f#,funscript,Reflection,F#,Funscript,我正在为FunScript项目(F#to Javascript编译器)编写一些扩展。如果你感兴趣,你可以找到来源 我试着模仿等待观察的扩展。但是,如果我使用重载方法,例如AwaitObservable(w),AwaitObservable(w1,w2)…我在尝试将项目编译为Javascript时会遇到以下错误: An unhandled exception of type 'System.Reflection.AmbiguousMatchException' occurred in FSharp

我正在为FunScript项目(F#to Javascript编译器)编写一些扩展。如果你感兴趣,你可以找到来源

我试着模仿等待观察的扩展。但是,如果我使用重载方法,例如
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
)。然而,让我困惑的是,在寻找可观察对象时并没有发生错误,而是使用以下方法:

{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
    会抛出异常而不是返回无异常
  • 这是F#反射定义的缺陷还是不可避免的限制?有可能把它修好吗

  • 非常感谢您的帮助

    好的,这似乎没有简单的答案,所以我将尝试回答我自己的问题。经过进一步调查

  • 似乎由于
    Async.AwaitObservable
    以某种方式重载了存储的反射定义(这“不知何故”仍然无法解释),因此无法跟踪实现
    IObservable
    的类型,这就是为什么他们不知道应该使用
    Subscribe
    的哪个实现
  • 我猜这是预期的行为:返回
    None
    意味着没有找到反映的定义,但这里有一个不明确的匹配,因此情况不同
  • 我还不知道这是一个bug还是一个“功能”,但在任何情况下,我都使用
    CompiledName
    属性修复了这个特殊情况下的问题,并为每个重载指定了不同的名称。现在一切正常:)
  • 我希望下一次我发布一个能够得到回答的问题;)感谢所有花时间读这篇文章的人