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。
我正在尝试设置 protobuf-net 通过创建自定义类型模型并将成功和失败添加为结果的子类型来序列化可区分的联合。但要使其发挥作用,需要为每个类指定 ,并且该类必须保持不变。我希望能够自动化设置,但需要能够有一个与每种类型相关的数字,并且这种关系永远不会改变。如果标签可以在可区分联合定义中进行硬编码,那么它似乎是完美的。
所以我们可以直接阅读规范:
如果 U 有不止一种情况,则它有一个 CLI 嵌套类型 U.Tags。U.Tags 类型对于每种情况都包含一个整数文字,从零开始按递增顺序排列。
(第 8.5.4 节)
因此,您似乎可以依赖元素的顺序,但插入新元素将导致创建新数字。