2013-07-12 17 views
7

Chciałbym zdefiniować jeden z moich parametrów, aby być parametrem C# out w jednym z moich interfejsów. Zdaję sobie sprawę, że F # obsługuje byref, ale jak mogę zastosować System.Runtime.InteropServices.OutAttribute do jednego z moich parametrów interfejsu?Jak używać atrybutów w interfejsie F #?

C# Interfejs Próbuję replikować

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

Dlaczego trzeba atrybut współdziałania dla tego ? C# i F # są jednocześnie kodami zarządzanymi. –

+1

@Robert Nie wierzę, że F # ma wbudowane słowo kluczowe "out". Dlatego atrybut musi być użyty do emisji właściwego IL podczas kompilacji. – Dave

+0

Tak, ale atrybut jest powiązany z interopem COM, a nie zarządzanym "współdziałaniem". Zobacz http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.outattribute.aspx Ah, nieważne. Mówi tam, że można go również używać do wywoływania platformy, i że jest to odpowiednik słowa kluczowego "out" w C# –

Odpowiedz

11

Oto przykład:

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 

Oto twój interfejs, przekład:

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

Dziękuję bardzo @Jack! – Dave

Powiązane problemy