O que Expression.Quote () faz que Expression.Constant () já não pode fazer?

Nota: estou ciente da pergunta anterior "Qual é o objetivo do método Expression.Quote do LINQ?, mas se você ler, verá que isso não responde à minha pergunta.

Eu entendo qual o objetivo declarado deExpression.Quote() é. Contudo,Expression.Constant() pode ser usado para a mesma finalidade (além de todas as finalidades queExpression.Constant() já é usado para). Portanto, eu não entendo por queExpression.Quote() é de todo necessário.

Para demonstrar isso, escrevi um exemplo rápido em que alguém usaria normalmenteQuote (veja a linha marcada com pontos de exclamação), mas eu useiConstant e funcionou igualmente bem:

string[] array = { "one", "two", "three" };

// This example constructs an expression tree equivalent to the lambda:
// str => str.AsQueryable().Any(ch => ch == 'e')

Expression<Func<char, bool>> innerLambda = ch => ch == 'e';

var str = Expression.Parameter(typeof(string), "str");
var expr =
    Expression.Lambda<Func<string, bool>>(
        Expression.Call(typeof(Queryable), "Any", new Type[] { typeof(char) },
            Expression.Call(typeof(Queryable), "AsQueryable",
                            new Type[] { typeof(char) }, str),
            // !!!
            Expression.Constant(innerLambda)    // <--- !!!
        ),
        str
    );

// Works like a charm (prints one and three)
foreach (var str in array.AsQueryable().Where(expr))
    Console.WriteLine(str);

A saída deexpr.ToString() é o mesmo para os dois também (se eu usoConstant ouQuote)

Dadas as observações acima, parece queExpression.Quote() é redundante. O compilador C # poderia ter sido criado para compilar expressões lambda aninhadas em uma árvore de expressões envolvendoExpression.Constant() ao invés deExpression.Quote(), e qualquer provedor de consulta LINQ que queira processar árvores de expressão em outra linguagem de consulta (como SQL) pode procurar umConstantExpression com tipoExpression<TDelegate> em vez de umUnaryExpression com o especialQuote tipo de nó e tudo o mais seria o mesmo.

o que estou perdendo? Por quê foiExpression.Quote() e o especialQuote tipo de nó paraUnaryExpression inventado?

questionAnswers(4)

yourAnswerToTheQuestion