给定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
的方式相关吗?
答案 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()) {
...
}