anchor.diff:  let defaultEncodeUnionTag _ (tag: int) =
       Some ("$", EncodedNumber (string tag))
   
  +/// Some (Some x) if tagged [<NameUnionCases x>];
  +/// Some None if tagged [<NamedUnionCases>];
  +/// None if not tagged.
   let getDiscriminatorName (t: System.Type) =
       t.GetCustomAttributesData()
       |> Seq.tryPick (fun cad ->
  
positive.code:         FST.GetUnionCases(t, flags)
          |> Array.map (fun c ->
              let mk = FSV.PreComputeUnionConstructor(c, flags)
              let fs =
                  c.GetFields()
                  |> Array.mapi (fun k f ->
                      i.GetEncodedUnionFieldName f k, decodeOptionalField dD i f f.PropertyType)
              (mk, fs))
  
negative.code:         FST.GetUnionCases(t, flags)
          |> Array.map (fun c ->
              let r = FSV.PreComputeUnionReader(c, flags)
              let fields = c.GetFields()
              let r, fields =
                  if isInlinableRecordCase c then
                      let rt = fields.[0].PropertyType
                      let rr = FSV.PreComputeRecordReader(rt, flags)
                      let r x = rr (r x).[0]
                      r, FST.GetRecordFields(rt, flags)
                  else r, fields
              let fs = fields |> Array.mapi (fun k f ->
                  i.GetEncodedUnionFieldName f k, encodeOptionalField dE i f f.PropertyType)
              (r, fs))
      let encodeTag = i.EncodeUnionTag t
      fun (x: obj) ->
  