Добавление атрибута 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
возможно для этого типа классов (я думаю). Как я должен реорганизовать свой код, чтобы избежать этой ошибки?
1 ответ
Решение
Как говорится в сообщении об ошибке, 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
пожалуйста, посмотрите на примеры кода здесь.