2

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

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# 规范中吗?
  • 是否可以提供自定义标签号,以便如果订单更改或我在中间放置另一个案例,在成功和失败之间,它们的标签号不会改变?

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

4

1 回答 1

4

所以我们可以阅读规范:

如果 U 有多个 case,则它有一个 CLI 嵌套类型 U.Tags。U.Tags 类型为每种情况包含一个整数文字,从零开始按递增顺序。

(第 8.5.4 节)

所以看起来你可以依赖元素的顺序,但是插入新元素会导致新的数字被创建。

于 2014-07-31T21:43:03.050 回答