Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net F#静态成员约束结合IDisposable_.net_Compiler Errors_F#_Type Constraints - Fatal编程技术网

.net F#静态成员约束结合IDisposable

.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

我想实现一个通用的F#类,其类型参数肯定提供了一个名为“TryParse”的静态方法。除此之外,我希望我的班级在不再需要后得到正确的处置。我提出了以下实现:

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>()