20

我知道在 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>)
4

2 回答 2

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从您的方法返回 a 并将可能解析的内容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"
于 2012-11-25T01:16:24.963 回答
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")
于 2012-11-25T01:13:12.993 回答