объектное выражение может иметь только один тип. Тип - это тип первого (основного) реализованного интерфейса - в вашем случае это тип IconnMan
. F # не позволяет вам использовать use
, потому что он статически не знает, что результат функции connman
равен IDisposable
.
Вы можете создавать интерфейсы в выражении объекта в обратном порядке:
let connman () =
let conn = new SqlConnection(connectionstring)
conn.Open()
{ new IDisposable with
member x.Dispose() =
conn.Close()
conn.Dispose()
interface IConnMan with
member x.Connect () = conn
member x.Disconnect c = () }
Тогда вы могли бы написать use cn = connman()
, но вы не могли бы использовать функции IConnMan
без приведения (это по сути то же самое, что делать то, что предлагает Desco). Я не думаю, что есть какое-то хорошее решение этой проблемы.
Может ли ваш IConnMan
интерфейс наследовать от IDisposable
?