【发布时间】:2018-03-08 03:30:39
【问题描述】:
我正在向这样的记录类型添加静态构建器方法:
type ThingConfig = { url: string; token : string; } with
static member FromSettings (getSetting : (string -> string)) : ThingConfig =
{
url = getSetting "apiUrl";
token = getSetting "apiToken";
}
我可以这样称呼它:
let config = ThingConfig.FromSettings mySettingsAccessor
现在是棘手的部分:我想添加第二个重载构建器以供 C# 使用(暂时忽略重复的实现):
static member FromSettings (getSetting : System.Func<string,string>) : ThingConfig =
{
url = getSetting.Invoke "apiUrl";
token = getSetting.Invoke "apiToken";
}
这适用于 C#,但会破坏我之前的 F# 调用 错误 FS0041:无法根据此程序点之前的类型信息确定方法“FromSettings”的唯一重载。可能需要类型注释。候选:静态成员 ThingConfig.FromSettings : getSetting:(string -> string) -> ThingConfig,静态成员 ThingConfig.FromSettings : getSetting:Func -> ThingConfig
为什么 F# 不能确定调用哪一个?
该类型注释会是什么样子? (我可以从调用站点注释参数类型吗?)
这种互操作有更好的模式吗? (重载接受来自 C# 和 F# 的 lambda)
【问题讨论】:
-
虽然这个问题与stackoverflow.com/questions/10110174/…相关,但相同的概念适用于两个答案(F# 编译器从
Func<_,_>自动转换为 .NET 委托) ,我认为应该关闭该问题的副本还不够。这两个问题本身都很有用。
标签: f#