如何在F#中创建具有out参数的成员

时间:2012-11-25 00:32:20

标签: f# clr

我知道在f#中我可以将out参数视为结果元组的成员,当我从F#使用它们时,例如

(success, i) = System.Int32.TryParse(myStr)

我想知道的是我如何定义一个成员,使C#中的签名具有out参数。

有可能这样做吗?我可以返回一个元组,当我从C#调用该方法时会发生相反的过程,例如

type Example() =
  member x.TryParse(s: string, success: bool byref)
    = (false, Unchecked.defaultof<Example>)

2 个答案:

答案 0 :(得分:18)

不,您不能将结果作为元组返回 - 您需要在从函数返回结果之前将值分配给byref值。另请注意[<Out>]属性 - 如果将其保留,则该参数的行为类似于C#ref参数。

open System.Runtime.InteropServices

type Foo () =
    static member TryParse (str : string, [<Out>] success : byref<bool>) : Foo =
        // Manually assign the 'success' value before returning
        success <- false

        // Return some result value
        // TODO
        raise <| System.NotImplementedException "Foo.TryParse"

如果您希望您的方法具有规范的C#Try签名(例如,Int32.TryParse),则应从方法返回bool并传递可能已解析的Foo }}返回byref<'T>,如下所示:

open System.Runtime.InteropServices

type Foo () =
    static member TryParse (str : string, [<Out>] result : byref<Foo>) : bool =
        // Try to parse the Foo from the string
        // If successful, assign the parsed Foo to 'result'
        // TODO

        // Return a bool indicating whether parsing was successful.
        // TODO
        raise <| System.NotImplementedException "Foo.TryParse"

答案 1 :(得分:4)

open System.Runtime.InteropServices

type Test() = 
    member this.TryParse(text : string, [<Out>] success : byref<bool>) : bool = 
       success <- false
       false
let ok, res = Test().TryParse("123")