На самом деле четыре связанных вопроса:Где неявный литье из TDelegate в выражение <TDelegate>?
1) Почему это возможно?
Expression<Func<int, int>> incrementorExpression = (i => i + 1);
Но не быть в состоянии это сделать?
LambdaExpression decrementorExpression = (i => i - 1);
Во втором случае, сообщения компилятора, таким образом: «Не удается преобразовать лямбда-выражения к типу„System.Linq.Expressions.LambdaExpression“, потому что это не тип делегата»
2) Где является листинг между TDelegate
и Expression<TDelegate>
? Кажется, я помню, что видел это в прошлом, но, похоже, не могу найти его сейчас. Но я не могу быть уверен, видел ли я это или нет.
3) Когда я делаю это:
Expression<Func<int, int>> incrementExpression = (i => ++i);
Компилятор говорит, "Выражение дерево не может содержать оператор присваивания." Почему это так?
4) И потом, если я могу это сделать:
Expression<Func<int, int>> incrementorExpression = (i => i + 1);
Тогда почему я не могу сделать this?
public Expression<Func<T>> ToExpression<T>(Func<T> func)
{
return func;
}
Я не думаю, что 3 принадлежит: 'i => (i = i + 1)' на самом деле не представляет собой выражение ... –
Но '++ i' просто означает' return (i + 1) '. Это не означает «i = i + 1». 'i + = 1' не будет выражением, так как это будет означать' i = i + 1', и это будет утверждение. –
Это новости для меня ... '++ i' is' {i = i + 1; return i;} 'Насколько мне известно ... –