f#:常量联合案例标记号

Sum*_*rak 2 f# protobuf-net discriminated-union

可区分联合类型中的每个联合案例都会获得一个标签号

type Result<'TSuccess,'TFailure> = 
   | Success of 'TSuccess
   | Failure of 'TFailure

let cases = FSharpType.GetUnionCases typedefof<Result<_,_>>
for case in cases do
    case.Tag
Run Code Online (Sandbox Code Playgroud)

从查看编译的代码来看,它是由编译器生成的,并且根据情况的顺序是常量。所以成功为 0,失败为 1。

  • 标签号是否总是根据订单生成?这是 F# 规范中的内容吗?
  • 是否可以提供自定义标签号,以便如果订单发生变化或者我在成功和失败之间放置另一个案例,它们的标签号不会改变?

我正在尝试设置 protobuf-net 通过创建自定义类型模型并将成功和失败添加为结果的子类型来序列化可区分的联合。但要使其发挥作用,需要为每个类指定 ,并且该类必须保持不变。我希望能够自动化设置,但需要能够有一个与每种类型相关的数字,并且这种关系永远不会改变。如果标签可以在可区分联合定义中进行硬编码,那么它似乎是完美的。

Joh*_*mer 5

所以我们可以直接阅读规范:

如果 U 有不止一种情况,则它有一个 CLI 嵌套类型 U.Tags。U.Tags 类型对于每种情况都包含一个整数文字,从零开始按递增顺序排列。

(第 8.5.4 节)

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