鉴于以下片段:
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 () -> ())
我不知道如何强制编译器在
Action
和 unit -> unit
之间进行选择。另外两个选项:Action
重载为主并执行 Foo.Test(Action(act))
但我的建议是采用
Action
的单一方法。由于转换是自动的,互操作在某种意义上是免费的。关于f# - Action 和单元之间重载解析的歧义 - > F#中的单元类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10198597/