无法在F#类中访问Dispose方法

时间:2013-01-22 03:18:19

标签: f# dispose

我在F#中创建了一个实现IDisposable接口的类。该类被正确清理,use关键字能够访问Dispose方法。我有第二个用例,我需要显式调用Dispose方法,我无法在下面的示例中。似乎在课堂上没有使用Dipose方法。

open System

type Foo() = class
    do
        ()

    interface IDisposable with
        member x.Dispose() =
            printfn "Disposing"

end

let test() =
    // This usage is ok, and correctly runs Dispose()
    use f = new Foo()


    let f2 = new Foo()
    // The Dispose method isn't available and this code is not valid
    // "The field , constructor or member Dispose is not defined."
    f2.Dispose()

test()

2 个答案:

答案 0 :(得分:10)

在F#类中实现接口更类似于C#中的显式接口实现,这意味着接口的方法不会成为方法的公共类。要调用它们,您需要将类强制转换为接口(不能失败)。

这意味着,要调用Dispose,您需要写:

(f2 :> IDisposable).Dispose()

实际上,这不是经常需要的,因为use关键字确保在值超出范围时自动调用Dispose,所以我会写:

let test() =
  use f2 = new Foo()
  f2.DoSomething()

此处,当f2函数返回时,test会被释放。

答案 1 :(得分:1)

托马斯说得对。仅供参考,您可以在类型上实现Dispose()函数以便于使用:

member x.Dispose() = (x :> IDisposable).Dispose()

那是之外的<{1}}的实现。然后你可以写IDisposable