我知道在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>)
答案 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")