2012-10-31 29 views
4

我有:添加StructLayout屬性F#類型與隱式構造

type Package = 
    abstract member Date : int 
    abstract member Save : unit -> unit 

[<type:StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)>] 
type Instant(date : int, value : int) = 
    let mutable _date = date 
    let mutable _value = value 
    member X.Value : int = _value 
    interface Package with  
     member X.Date : int = _date 
     member X.Save() = ... 

,但得到的錯誤:只有無隱構造結構和類,可給予「StructLayout」屬性

所以我意識到它必須是類似的:

type Instant = 
    struct 
     val Date : byte array 
     ... 

但是這樣我就失去了我的界面。在C#中,例如,爲這種類型添加type:StructLayout是可能的(我認爲)。我該如何重構我的代碼才能避免此錯誤?

回答

5

由於錯誤消息說,StructLayout應與explicit constructors工作:

type Package = 
    abstract member Date : int 
    abstract member Save : unit -> unit 

[<type:StructLayout(LayoutKind.Sequential, Pack=1, CharSet=CharSet.Ansi)>] 
type Instant = 
    val mutable Date: int 
    val mutable Value: int 
    new(date, value) = {Date = date; Value = value} 

    interface Package with 
     member x.Date = x.Date 
     member x.Save() = x.Value |> ignore 

如果您有任何FieldOffset進一步的問題,請看看代碼示例here

+0

謝謝。我可以從Save()中訪問Value和How? – Cynede

+0

和Date一樣,只需使用'x.Value'。 – pad

+0

不,我得到奇怪的錯誤:這個值不是一個函數,不能應用 – Cynede