public virtual bool VisitCastExpression(CastExpression castExpression, object d)
 {
     if ((castExpression == null)) {
         return SetFailure();
     }
     if ((d == null)) {
         return SetFailure();
     }
     if ((castExpression.CastTo == null)) {
         return SetFailure();
     }
     if ((castExpression.Expression == null)) {
         return SetFailure();
     }
     if(castExpression.GetType() != d.GetType()) {return SetFailure();}
     var data = (CastExpression)d;
     if (!IsMatch(castExpression, data)) {
         return SetFailure();
     }
     castExpression.CastTo.AcceptVisitor(this, data.CastTo);
     return castExpression.Expression.AcceptVisitor(this, data.Expression);
 }