Подтвердить что ты не робот

Как создать элемент с параметром out в F #

Я знаю, что в f # я могу рассматривать параметры out как члены кортежа результата, когда я использую их из F #, например

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

Что я хотел бы знать, так это то, как я определяю член, чтобы иметь подпись, которая появляется на С#, с параметром out.

Можно ли это сделать? И могу ли я просто вернуть кортеж и иметь обратный процесс, когда я вызываю метод из С#, например.

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

Ответ 1

Нет, вы не можете вернуть результат в виде кортежа - вам нужно присвоить значение значению byref перед возвратом результата из функции. Также обратите внимание на атрибут [<Out>] - если вы оставите это, параметр действует как параметр С# 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"

Если вы хотите, чтобы ваш метод имел каноническую подпись С# 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"

Ответ 2

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