Краткий ответ: нет.
Более длинный ответ, который может быть не актуален:
- Если вы назначите лямбду типу делегата (например,
Func
или Action
), вы получите анонимный делегат.
- Если вы назначите лямбду типу Expression, вы получите дерево выражений вместо анонимного делегата. Затем дерево выражений может быть скомпилировано с анонимным делегатом.
Изменить: Вот несколько ссылок для выражений.
- System.Linq.Expression.Expression (TDelegate) (начать здесь).
- Linq в памяти с делегатами (такими как System.Func) использует System.Linq.Enumerable . Linq to SQL (и все остальное) с выражениями использует System.Linq.Queryable . Проверьте параметры этих методов.
- Объяснение от ScottGu . В двух словах, Linq in-memory создаст несколько анонимных методов для решения вашего запроса. Linq to SQL создаст дерево выражений, которое представляет запрос, а затем переведет это дерево в T-SQL. Linq to Entities создаст дерево выражений, которое представляет запрос, а затем переведет это дерево в соответствующий SQL платформу.
Мне нравится ответ Эми, но я думал, что буду педантичным. Вопрос говорит: «После того, как он составлен» - что говорит о том , что оба выражения было скомпилированы. Как они оба могут скомпилироваться, но с одним преобразованным в делегат, а другим в дерево выражений? Это сложный вопрос - вы должны использовать другую функцию анонимных методов; единственный, который не разделяется лямбда-выражениями. Если указать анонимный метод без указания списка параметров на все он совместит с любым типом делегата возвращения недействительным и без каких - либо
out
параметров. Вооружившись этим знанием, мы должны иметь возможность создать две перегрузки, чтобы сделать выражения совершенно однозначными, но очень разными.Но беда поражает! По крайней мере, в C # 3.0 вы не можете преобразовать лямбда-выражение с телом блока в выражение, равно как вы не можете преобразовать лямбда-выражение с присваиванием в теле (даже если оно используется в качестве возвращаемого значения). Это может измениться в C # 4.0 и .NET 4.0, которые позволяют выразить больше в дереве выражений. Другими словами, с примерами, которые MojoFilter привел, эти два почти всегда будут преобразованы в одно и то же. (Подробнее через минуту.)
Мы можем использовать трюк с параметрами делегата, если немного изменим тела:
Но ждать! Мы можем различать эти два, даже не используя деревья выражений, если мы достаточно хитры. В приведенном ниже примере используются правила разрешения перегрузки (и трюк с анонимным делегатом) ...
Уч. Помните, дети, каждый раз, когда вы перегружаете метод, унаследованный от базового класса, маленький котенок начинает плакать.
источник
delegate { ... }
это не то же самое,delegate() { ... }
что последний совместим только с типом делегата без параметров.В двух приведенных выше примерах нет разницы, ноль.
Выражение:
является лямбда-выражением с телом оператора, поэтому его нельзя скомпилировать как дерево выражений. На самом деле он даже не компилируется, потому что ему нужно точка с запятой после 0:
источник
Эми Б правильно. Обратите внимание, что могут быть преимущества использования деревьев выражений. LINQ to SQL проверит дерево выражений и преобразует его в SQL.
Вы также можете поиграть с лямдами и деревьями выражений, чтобы эффективно передавать имена членов класса в среду безопасным для рефакторинга способом. Moq является примером этого.
источник
Есть разница
Пример:
И я заменяю на лямбду: (ошибка)
источник
Некоторые основы здесь.
Это анонимный метод
Поскольку у анонимных методов нет имен, нам нужен делегат, в котором мы можем назначить оба этих метода или выражения. например
То же самое с лямбда-выражением. Обычно нам нужен делегат, чтобы использовать их
Мы можем использовать делегат func, чтобы использовать это выражение.
источник