Вызов метода интерфейса на объекте F # из C # - PullRequest
4 голосов
/ 18 октября 2011

Учитывая тип 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 # не позволяет автоматически вызывать .Dispose() для типа Foo из F #?

Ответы [ 2 ]

14 голосов
/ 18 октября 2011

Реализации интерфейса в F # являются явными по умолчанию.Следовательно, методы не видны, если они не видны из типа, преобразованного в интерфейс (некоторая форма приведения).

Чтобы обойти это, откройте метод экземпляра, который имеет ту же сигнатуру, что и версия интерфейса.Затем перенесите интерфейс на функцию экземпляра.Например

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

    interface IDisposable with
        member this.Dispose() = this.Dispose()
3 голосов
/ 18 октября 2011

Как насчет этого конкретного интерфейса:

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