f #: постоянный номер тега случая объединения

Каждому случаю объединения в дискриминированном типе объединения присваивается номер тега

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 для сериализации размеченного объединения, создав модель настраиваемого типа и добавив успех и неудачу в качестве подтипов результата. Но для того, чтобы это работало, необходимо указать для каждого класса, который должен оставаться постоянным. Я надеялся автоматизировать настройку, но мне нужно было иметь возможность иметь число, относящееся к каждому типу, и чтобы эта связь никогда не менялась. Тег кажется идеальным, если его можно жестко запрограммировать в определении размеченного объединения.


person Sumrak    schedule 31.07.2014    source источник
comment
Я добавил кое-что по этому поводу, с некоторыми подробностями в этом другом ответе   -  person Ruben Bartelink    schedule 23.08.2014


Ответы (1)


Итак, мы можем просто прочитать спецификацию:

Если U имеет более одного случая, у него есть один вложенный тип CLI U.Tags. Тип U.Tags содержит по одному целочисленному литералу для каждого случая в порядке возрастания, начиная с нуля.

(раздел 8.5.4)

Таким образом, кажется, что вы можете полагаться на порядок элементов, но вставка новых элементов приведет к созданию новых чисел.

person John Palmer    schedule 31.07.2014
comment
Вы можете написать модульный тест, чтобы подтвердить это, и включить его в процесс сборки protobuf-net, если хотите быть осторожными. - person Christopher Stevenson; 01.08.2014