4

私が持っている:

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、このタイプのクラスに追加が可能です(私は思います)。このエラーを回避するには、コードをどのようにリファクタリングする必要がありますか?

4

1 に答える 1

5

エラーメッセージが言ったように、明示的なコンストラクターStructLayoutで動作するはずです:

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のコード例をご覧ください。

于 2012-10-31T09:40:16.440 に答える