从C#调用F#对象的接口方法

时间:2011-10-17 20:25:23

标签: f# c#-to-f#

给定F#类型:

type Foo() =
    member this.Prop with get() = ()

    interface IDisposable with
        member this.Dispose() = ()

在C#中,我创建了对象,但我无法调用Dispose()

var x = new Foo();
x.Dispose(); // compile error, x does not contain a definition of Dispose

但是,我可以写:

((IDisposable)x).Dispose(); // works, but I don't like the cast

有没有办法避免C#中的强制转换?这与F#不会自动让您在F#中调用.Dispose()类型上的Foo的方式相关吗?

2 个答案:

答案 0 :(得分:14)

默认情况下,F#中的接口实现是显式的。因此,除非从转换为界面的类型(某种形式的投射)中看到,否则这些方法是不可见的。

要解决此问题,请公开一个与接口版本具有相同签名的实例方法。然后将接口转发到实例函数。例如

type Foo() =
    member this.Prop with get() = ()
    member this.Dispose() = ()

    interface IDisposable with
        member this.Dispose() = this.Dispose()

答案 1 :(得分:3)

对于这个特定的界面怎么样:

using (var x = new Foo()) {
    ...
}