.net F#静态成员约束结合IDisposable
我想实现一个通用的F#类,其类型参数肯定提供了一个名为“TryParse”的静态方法。除此之外,我希望我的班级在不再需要后得到正确的处置。我提出了以下实现:.net F#静态成员约束结合IDisposable,.net,compiler-errors,f#,type-constraints,.net,Compiler Errors,F#,Type Constraints,我想实现一个通用的F#类,其类型参数肯定提供了一个名为“TryParse”的静态方法。除此之外,我希望我的班级在不再需要后得到正确的处置。我提出了以下实现: type Listener<'a when ^a : (static member TryParse : string -> ^a option)>() = // construct the object here let input : string = "" // get input
type Listener<'a when ^a : (static member TryParse : string -> ^a option)>() =
// construct the object here
let input : string = "" // get input
let res = (^a : (static member TryParse : string -> ^a option) input)
member this.Start() =
// ...
()
interface IDisposable with
member this.Dispose() =
// do cleanup
()
我可以通过用“inline”修饰Start()成员来修复它,但我无法用接口定义来修复它
是否可以同时强制我的泛型类型以实现静态方法和定义类?如注释中所述,类不能具有静态解析的类型参数。如果您想做类似的事情,一个好的技巧是使用一个内联方法,该方法具有约束并捕获稍后在接口或一级函数中需要的操作 在您的情况下,您可以将类更改为将
tryParse:string->'选项
作为参数,然后使用一个静态方法,该方法将允许您为支持它的类型自动捕获该参数:
type Listener<'a>(tryParse : string -> 'a option) =
let input : string = ""
let res = tryParse input
member this.Start() = ()
interface System.IDisposable with
member this.Dispose() = ()
类不能有SRTP,只有函数可以。有趣的事实是:没有IDisposable接口,并且在“开始”成员中添加了“内联”说明符,类在Visual Studio中进行类型检查,但随后会得到一个链接错误。
type Listener<'a>(tryParse : string -> 'a option) =
let input : string = ""
let res = tryParse input
member this.Start() = ()
interface System.IDisposable with
member this.Dispose() = ()
type Listener =
static member inline Create< ^b
when ^b : (static member TryParse : string -> ^b option)>() =
new Listener< ^b >(fun input ->
(^b : (static member TryParse : string -> ^b option) input))
let l = Listener.Create<Foo>()