在 F# 中使用绑定接口

Using bound interface in F#

我正在尝试在 F# 中使用 C# 库,所以这将是非常具体的情况。我在 F# 中使用 Servicestack。现在,我正在尝试使用方法

将 class 与接口连接起来
RegisterAutoWiredAs<T,'TAs>()

签名。 这是 'T 具有必须实现 'TAs 的约束。 它在 C# 代码中运行良好。

但是 F# 在使用接口时有限制。

let f:IFoo = Foo() // will give type error
let fi:IFoo - Foo() :> IFoo // will work

这里Foo实现了IFoo。因此,这部分与 C# 等效部分完全不同。现在,如果我这样做,上面的签名会给出类型错误

container.RegisterAutoWiredAs<Foo,IFoo>()

并且无法在给参数的同时进行转换。

这是我正在尝试 运行 的原始项目中的 line。此代码中的所有内容除此部分外均有效,而且遗憾的是其他等效方法也失败了。

这是我在该项目中遇到的错误

This expression was expected to have type 'MemoryChatHistory' but here has type 'IChatHistory'

F# 不支持隐式接口实现。

我认为在这种情况下,您可以通过将 IChatHistory 设为抽象 class 而不是接口(使用 [<AbstractClass>] 属性)来解决此问题。

编辑:

不,我今天有机会玩它。我认为用 F# 中的那些类型参数直接调用此方法是不可能的。看到这个问题

How do I translate a `where T : U` generic type parameter constraint from C# to F#?

进行更多讨论。

您可以通过使用反射调用方法来解决这个问题。