20

outf#では、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"

Tryメソッドに正規のC#シグネチャ(たとえば)を持たせたい場合は、メソッドからaInt32.TryParseを返し、bool解析された可能性のあるものFoobyref<'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 に答える