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: #else
          project path instance
  #endif
          
      /// Projects an instance to member of given value
      member __.ProjectExpr (instance : Expr<'DeclaringType>) =
          projectExpr<'DeclaringType, 'MemberType> path instance
  
      /// Injects a value to member of given instance
      member __.Inject (instance : 'DeclaringType) (field : 'MemberType) : 'DeclaringType =
  
negative.code:         if notFound then raise <| KeyNotFoundException(sprintf "Union case: %A" caseName)
          i
  
  #if TYPESHAPE_NO_EXPR
  #else
      member __.GetTagExpr (union : Expr<'U>) : Expr<int> =
          let expr =
              match tagReaderInfo with
  