C # Синтаксис выражения - PullRequest
       14

C # Синтаксис выражения

0 голосов
/ 23 декабря 2009

Я думал о разнице между Expression<Func<>> и Func<> и задавался вопросом, можно ли преобразовать статический метод в дерево выражений следующим образом:

class Program
{
    static void Main(string[] args)
    {
        Func<int, int> t = x => hrm(x);
        Func<int, int> t2 = new Func<int, int>(hrm);

        // Works as expected:
        Expression<Func<int, int>> et = x => hrm(x);
        // Brokenness:
        Expression<Func<int, int>> et2 = new Func<int, int>(hrm);
    }

    static int hrm(int x)
    {
        return x + 9;
    }
}

Что такого особенного во втором "Func <>", что его нельзя преобразовать в выражение, когда первое может?

Ответы [ 4 ]

4 голосов
/ 23 декабря 2009

Я думаю, что ваша путаница связана с тем, что лямбда-выражения могут представлять выражения или делегаты (с тем же синтаксисом) в C #. Итак, этот код:

x => hrm(x)

означает что-то другое в зависимости от того, где написано. При назначении на Func<int, int> он компилируется как обычно для создания делегата Func<int, int>. Однако при присвоении выражению компилятор C # откладывает компиляцию, и фрагмент интерпретируется как выражение. Сравните это с new Func<int, int>(hrm), который всегда возвращает делегата Func<int, int>.

1 голос
/ 23 декабря 2009

Только лямбда-выражения могут быть преобразованы в деревья выражений. Вот почему ваш второй вариант не будет компилироваться.

Вы можете создать дерево выражений для представления вызова hrm(), но это будет либо через лямбду, либо путем создания AST вручную. Более того, ни в одном из случаев тело hrm() никогда не будет доступно в виде дерева выражений - если это то, что вы хотели сделать.

1 голос
/ 23 декабря 2009

Мое понимание:
Лямбда может быть либо выражением , либо делегатом / действием / функцией.
Первый пример работает, потому что левая сторона гарантирует, что вы хотите выражение.
Второй пример не работает, потому что вы создаете Func <> явно с правой стороны.

0 голосов
/ 23 декабря 2009

Я бы рекомендовал вам взглянуть на эти два сообщения в блоге: Основы дерева выражений Чарли Калверта и мой собственный пост Создание динамических методов с деревьями выражений в Visual Studio 2010 .

Это должно дать вам некоторое представление о синтаксисе деревьев выражений и о том, что они могут и не могут делать.

...