anchor.diff:  
               setValue obj path.[n - 1] value
               r
  +
  +#if TYPESHAPE_NO_EXPR
  +#else
  +    let projectExpr<'Record, 'Member> (path : MemberInfo[]) (expr : Expr<'Record>) =
  +        let rec aux expr (m:MemberInfo) =
  +            match m with
  +            | :? FieldInfo as fI -> Expr.FieldGet(expr, fI)
  +            | :? PropertyInfo as pI -> Expr.PropertyGet(expr, pI)
  +            | _ -> invalidMember m
  +
  +        Expr.Cast<'Member>(Array.fold aux (expr :> _) path) 
   
       let injectExpr (path : MemberInfo[]) 
                       (r : Expr<'TRecord>) 
  
positive.code:                 | m -> invalidMember m
                  
          Expr.Cast<unit>(aux 0 r)
  
  #if TYPESHAPE_EMIT
      open System.Reflection.Emit
  
negative.code:             | _ -> invalidOp <| sprintf "Unexpected tag reader info %O" tagReaderInfo
          
          Expr.Cast<int> expr
  #endif
          
          
      interface IShapeFSharpUnion with
  