代码之家  ›  专栏  ›  技术社区  ›  Sumrak

f#:常量联合箱标记号

  •  2
  • Sumrak  · 技术社区  · 10 年前

    区分的联合类型中的每个联合案例都有一个标签号

    type Result<'TSuccess,'TFailure> = 
       | Success of 'TSuccess
       | Failure of 'TFailure
    
    let cases = FSharpType.GetUnionCases typedefof<Result<_,_>>
    for case in cases do
        case.Tag
    

    从编译后的代码来看,它是由编译器生成的,并且是常量,具体取决于用例的顺序。所以成功是0,失败是1。

    • 标签编号是否始终基于订单生成?这是F#规格吗?
    • 是否可以提供自定义标签号,以便在订单更改或我在成功和失败之间放置另一个案例时,它们的标签号不会更改?

    我正在尝试通过创建自定义类型模型并添加Success和Failure作为Result的子类型来设置protobuf net以序列化区分的联合。但要实现这一点,需要为每个类指定,必须保持不变。我希望自动化设置,但需要能够有一个与每种类型相关的数字,并且这种关系永远不会改变。标签似乎是完美的,如果它可以在有区别的联合定义中硬编码的话。

    1 回复  |  直到 10 年前
        1
  •  4
  •   John Palmer    10 年前

    所以我们可以阅读规范:

    如果U有多个大小写,则它有一个CLI嵌套类型U.Tags。U.Tags类型为每个大小写包含一个整数文本,从零开始递增。

    (第8.5.4节)

    因此,您似乎可以依赖元素的顺序,但插入新元素将导致创建新的数字。