gpt4 book ai didi

f# - 使用 F# Struct 和 Explicit LayoutKind 创建标记联合

转载 作者:行者123 更新时间:2023-12-05 00:54:50 26 4
gpt4 key购买 nike

我正在尝试创建一个 F# 等价的标记联合。我需要在应用程序代码的热路径中使用它,其中有区别的联合可能会导致过多的堆分配。

这是示例:


[<Struct; StructLayout(LayoutKind.Explicit)>]
type Result =
[<DefaultValue; FieldOffset 0>]
val mutable IsAsync : bool
[<DefaultValue; FieldOffset 1>]
val mutable Async : Async<obj>
[<DefaultValue; FieldOffset 1>]
val mutable Sync : obj

但是,当我想为其提供某种创建方法时,问题就开始了。

示例 1
static member Async(a:Async<obj>) = Result(IsAsync = true; Async=a)
static member Sync(s:obj) = Result(IsAsync = false; Sync=s)

抛出 成员或对象构造函数“Result”采用 0 个参数,但此处给出 1。所需的签名是“Result()”编译错误。

示例 2
new(a:Async<obj>) = { IsAsync = true; Async = a; }
new(s:obj) = { IsAsync = false; Sync=s }

抛出无关字段已被赋予值编译错误。

最佳答案

你有三个问题:

  • 您需要用逗号( , )而不是分号( ; )分隔构造函数参数。
  • 对象引用必须在指针大小的边界上对齐。因此,在 x64 上,对象引用的偏移量必须为 8。
  • 静态和实例成员名称不应重叠。

  • 这对我有用:
    [<Struct; StructLayout(LayoutKind.Explicit)>]
    type Result =
    [<DefaultValue; FieldOffset 0>]
    val mutable IsAsync : bool
    [<DefaultValue(false); FieldOffset 8>]
    val mutable Async : Async<obj>
    [<DefaultValue; FieldOffset 8>]
    val mutable Sync : obj

    static member MakeAsync(a:Async<obj>) = Result(IsAsync = true, Async=a)
    static member MakeSync(s:obj) = Result(IsAsync = false, Sync=s)

    关于f# - 使用 F# Struct 和 Explicit LayoutKind 创建标记联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39202852/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com