鉴于以下片段:

type Foo() =
    static member Test (act : unit -> unit) = act()
    static member Test (act : Action) = Foo.Test act.Invoke

我在最后一行收到一条错误消息:无法根据此程序点之前的类型信息确定方法“Test”的唯一重载。可能需要类型注释。

不幸的是,类型注释 (act.Invoke : unit -> unit) 不能解决歧义,我找不到可以修复它的注释。我希望 Action 版本是 -> 版本的包装器。我的特定用例是定义一个将从 F# 和 C# 调用的类,因此我希望它能够在两种语言中本地工作。

最佳答案

F# 为您插入到 Action 的转换,因此您(理论上)可以使用一种方法。

type Foo() =
    static member Test (act : Action) = act.Invoke()

Foo.Test (fun () -> ())

我不知道如何强制编译器在 Actionunit -> unit 之间进行选择。另外两个选项:
  • 使 Action 重载为主并执行 Foo.Test(Action(act))
  • 将逻辑放在从公共(public)方法调用的第三个函数中

  • 但我的建议是采用 Action 的单一方法。由于转换是自动的,互操作在某种意义上是免费的。

    关于f# - Action 和单元之间重载解析的歧义 - > F#中的单元类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10198597/

    10-15 06:03
    查看更多