public static Expression <TDelegate> Create <TDelegate>(Expression body, ParameterExpression[] parameters, string name = null, bool tailCall = false)
        {
            if (parameters.Any(parameter => parameter.IsByRef)) // TODO handle this
            {
                return(Expression.Lambda <TDelegate>(body, name, tailCall, parameters));
            }
            var parameterz = new ParameterExpression[parameters.Length];

            Array.Copy(parameters, parameterz, parameters.Length);
            return((Expression <TDelegate>)GetLambdaFactory(typeof(TDelegate))(body, name, tailCall, new ReadOnlyCollection <ParameterExpression>(parameterz)));
        }
        public static LambdaExpression Create(Expression body, Type returnType, ParameterExpression[] parameters, string name = null, bool tailCall = false)
        {
            if (parameters.Any(parameter => parameter.IsByRef)) // TODO handle this
            {
                return(Expression.Lambda(body, name, tailCall, parameters));
            }
            var parameterz = new ParameterExpression[parameters.Length];

            Array.Copy(parameters, parameterz, parameters.Length);
            return(GetLambdaFactory(returnType, parameters)(body, name, tailCall, new ReadOnlyCollection <ParameterExpression>(parameterz)));
        }