Facendo seguito ai miei post precedenti, il metodo QueryExpression::Parse effettua chiaramente un controllo sui tipi coinvolti nell'espressione; ad es. Parse solleverebbe un'eccezione per un'espressione del tipo

x * 2

se x è un parametro dichiarato come stringa.
Un'altra interessante caratteristica del metodo Parse è che questo è in grado di inferire il tipo del risultato dell'espressione. Es:

string expr = "x + 2";
Dictionary<string, Expression> scope = new Dictionary<string, Expression>();
scope.Add("x", Expression.Parameter(typeof(int), "x"));
Expression expression = QueryExpression.Parse(expr, scope);

// Expression::Type è il tipo del valore calcolato dall'espressione.
Console.WriteLine(expression.Type);  // System.Int32

Se expr fosse invece

string expr = "x + 2.0";
// ...
Console.WriteLine(expression.Type);  // System.Double

Infine, se expr fosse ad es.

string expr = "x + \"Hello\"";
// ...
Console.WriteLine(expression.Type);  // System.String