2013-07-12 15 views
7

自分のパラメータの1つを自分のインタフェースのC#outパラメータに定義したいと思います。 F#はbyrefをサポートしていますが、どうすればSystem.Runtime.InteropServices.OutAttributeを自分のインターフェイスパラメータの1つに適用できますか?F#インターフェイスで属性を使用する方法は?

C#のインターフェイスは、私は

public interface IStatisticalTests 
{ 
    void JohansenWrapper(
     double[,] dat, 
     double alpha, 
     bool doAdfPreTests, 
     out double cointStatus, 
     out JohansenModelParameters[] johansenModelParameters); 
} 
+0

は、なぜあなたは、このために相互運用属性が必要になります? C#とF#はどちらもマネージコードです。 –

+1

@Robert私はF#に 'out'キーワードが組み込まれているとは思わない。したがって、コンパイル時に適切なILを出力するために属性を使用する必要があります。 – Dave

+0

ええ、属性はCOM interopに関連付けられており、管理されている「interop」ではありません。 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.outattribute.aspxを参照してください。ああ、気にしないでください。それは、プラットフォーム呼び出しのためにも使用できることと、C#の'out'キーワードと同等であることを示しています。 –

答えて

11

を複製しようとしていますここでの例です:ここでは

open System 
open System.Runtime.InteropServices 

[<Interface>] 
type IPrimitiveParser = 
    // 
    abstract TryParseInt32 : str:string * [<Out>] value:byref<int> -> bool 

[<EntryPoint>] 
let main argv = 
    let parser = 
     { new IPrimitiveParser with 
      member __.TryParseInt32 (str, value) = 
       let success, v = System.Int32.TryParse str 
       if success then value <- v 
       success 
     } 

    match parser.TryParseInt32 "123" with 
    | true, value -> 
     printfn "The parsed value is %i." value 
    | false, _ -> 
     printfn "The string could not be parsed." 

    0 // Success 

はあなたのインターフェイスは、翻訳、です:

[<Interface>] 
type IStatisticalTests = 
    // 
    abstract JohansenWrapper : 
     dat:float[,] * 
     alpha:float * 
     doAdfPreTests:bool * 
     [<Out>] cointStatus:byref<float> * 
     [<Out>] johansenModelParameters:byref<JohansenModelParameters[]> 
      -> unit 
+0

大変ありがとう@ジャック! – Dave