Что Expression.Quote () делает то, что Expression.Constant () не может уже сделать?

Примечание: мне известен предыдущий вопросКакова цель метода LINQ Expression.Quote?, но если вы читаете дальше, вы увидите, что это не отвечает на мой вопрос.

Я понимаю в чем заявленная цельExpression.Quote() является. Тем не мение,Expression.Constant() может использоваться для той же цели (в дополнение ко всемExpression.Constant() уже используется для). Поэтому я не понимаю, почемуExpression.Quote() это вообще требуется.

Чтобы продемонстрировать это, я написал быстрый пример, где обычноQuote (см. строку, отмеченную восклицательными знаками), но я использовалConstant вместо этого и он работал одинаково хорошо:

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);

Выход изexpr.ToString() одинаково для обоих тоже (использую ли яConstant или жеQuote).

Учитывая вышеприведенные наблюдения, представляется, чтоExpression.Quote() избыточно Компилятор C # мог быть создан для компиляции вложенных лямбда-выражений в дерево выражений, включающееExpression.Constant() вместоExpression.Quote()и любой поставщик запросов LINQ, который хочет обрабатывать деревья выражений на каком-либо другом языке запросов (например, SQL), может искатьConstantExpression с типомExpression<TDelegate> вместоUnaryExpression с особымQuote тип узла, а все остальное будет таким же.

Что мне не хватает? ПочемуExpression.Quote() и специальныйQuote тип узла дляUnaryExpression изобрел?

Ответы на вопрос(4)

Ваш ответ на вопрос