Синтаксис лямбда-выражения против класса LambdaExpression - PullRequest
10 голосов
/ 26 февраля 2011

Эта строка кода, которая пытается присвоить лямбда-выражение переменной LambaExpression,

LambdaExpression expr = n => n;

сбой с сообщением об ошибке компиляции:

Невозможно преобразовать лямбду выражение для типа 'System.Linq.Expressions.LambdaExpression' потому что это не делегат тип

Так что это должен быть тип делегата. Концептуально это кажется мне странным, потому что я могу создать экземпляр LambdaExpression, используя фабричный метод, подобный этому.

Заводская лямбда от MSDN

LambdaExpression lambdaExpr = Expression.Lambda(
    Expression.Add(
        paramExpr,
        Expression.Constant(1)
    ),
    new List<ParameterExpression>() { paramExpr }
);

и это не тип делегата.

Это заставляет задуматься, почему лямбда в LambaExpression не может работать?

Ответы [ 4 ]

10 голосов
/ 26 февраля 2011

Ну, это работает работает:

Expression<Func<int, int>> exp = n => n;
LambdaExpression lambda = exp;

Обратите внимание, что Expression<TDelegate> происходит от LambdaExpression.

Я думаю,причина, по которой вы не можете просто использовать LambdaExpression в качестве типа, заключается в том, что тип n (в вашем примере) не может быть выведен.

Учтите, что вы также не можете этого сделать,в основном по той же причине:

// What is this? An Action? A ThreadStart? What?
Delegate d = () => Console.WriteLine("Hi!");

В то время как вы можете сделать это:

Action a = () => Console.WriteLine("Hi!");
Delegate d = a;

По сути, это то же самое.

2 голосов
/ 26 февраля 2011

Цитировать MSDN Тип LambdaExpression представляет лямбда-выражение в форме дерева выражений.Тип Expression, который является производным от LambdaExpression и более явно отражает тип лямбда-выражения, также может использоваться для представления лямбда-выражения.Во время выполнения узел дерева выражений, представляющий лямбда-выражение, всегда имеет тип Expression.

Значение свойства NodeType для LambdaExpression - Lambda.

Используйте фабричные методы Lambda для созданияОбъект LambdaExpression.

2 голосов
/ 26 февраля 2011

Поскольку LambdaExpression - это способ создания лямбда-выражений во время выполнения, где n => n преобразуется в сгенерированный класс во время компиляции.

Короче говоря: это две разные вещи, которые делают одно и то же, но их нельзя использовать вместе.

1 голос
/ 26 февраля 2011

Внимательно прочитайте, что говорит сообщение об ошибке. LambdaExpression не является делегатом. Это нормальный класс. Прочитайте http://msdn.microsoft.com/en-us/library/system.linq.expressions.lambdaexpression.aspx. Поскольку в названии присутствует лямбда, это не значит, что это то же самое, что «истинная» лямбда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...