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

Nei*_*ell 4 f# c#-to-f#

给定F#类型:

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

    interface IDisposable with
        member this.Dispose() = ()
Run Code Online (Sandbox Code Playgroud)

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

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

但是,我可以写:

((IDisposable)x).Dispose(); // works, but I don't like the cast
Run Code Online (Sandbox Code Playgroud)

有没有办法避免C#中的强制转换?这是关系到道路F#并不会自动让你叫.Dispose()Foo类型从F#中?

Jar*_*Par 14

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

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

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

    interface IDisposable with
        member this.Dispose() = this.Dispose()
Run Code Online (Sandbox Code Playgroud)

  • 我认为这不是在F#中使用OOP的原因.在F#中使用OOP应该是基于项目复杂性和整体设计的设计决策. (2认同)
  • 这个决定背后有什么理由,还是因为OCaml的向后兼容性?在我看来,当一个学生'是'人'时,我会假设学生有一个我可以要求的年龄,而不必先向IPerson施放.你知道为什么这样实现吗? (2认同)