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

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

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

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

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

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

Expression> innerLambda = ch => ch == 'e';

var str = Expression.Parameter(typeof(string), "str");
var expr =
    Expression.Lambda>(
        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 () одинаково для обоих (использую ли я Константу или Quote ).

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

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

93
задан Community 23 May 2017 в 12:02
поделиться