2017-02-01 2 views
2
return (Func<object, Task<object>>)(async (dynamic data) => 
{ 
    methodCall(data.data, data.more); 
    return null; 
}); 

Из того, что я собираю выше, код явно выполняет функцию лямбда-функции в качестве делегата, а затем возвращает этот делегат (в этом случае он возвращается к функции edgejs).Зачем нужны круглые скобки вокруг этой лямбда-функции?

При удалении парса из процесса сборки получено 8 ошибок.

Синтаксическая ошибка '' ожидаемый

; Ожидается

} ожидается

Название асинхронной не существует в текущем контексте

Название динамического не существует в текущем контексте

Данные имя не существует в текущем контексте

Данные названия не существуют в текущем контексте

Данные имени не существуют в текущий контекст

+1

Выньте их и посмотрите, скомпилированы ли они ... (Подсказка - это не так!) –

+0

@RB: Судя по названию вопроса, я думаю, что они уже это сделали. – BoltClock

+1

О, справедливо, в этом случае это должно гарантировать, что литье действует на полную функцию лямбда. –

ответ

2

Вероятно, это потому, что async is a contextual keyword, который имеет особое значение при появлении модификатора в методе или лямбда-сигнатуре. Без парнеров парсер считает, что async - это имя метода, в результате чего возникает ошибка, потому что компилятор не может найти метод с этим именем (и, кроме того, ошибка синтаксического анализа на =>, поскольку анализатор больше не потребляет лямбда-выражение при этом точка).

+0

Ahhhh, хорошо. Это имело бы смысл. Спасибо за ответ! Относительно новичок в async в .Net, так что все отлично очищает. Не понял, что async - это контекстуальное ключевое слово. – Robocrypt

+2

Это контекстно, так что каждый, кто использовал 'async' в качестве имени переменной за последнее десятилетие, не будет внезапно нарушать свой код, если они будут обновлены. –

+2

@Robocrypt, добавляющий ключевые слова в существующий язык, является деликатной вещью, потому что это потрясающее изменение. Вот почему новые функции обычно пытаются повторно использовать существующие ключевые слова или использовать контекстуальные совместно с синтаксисами, которые делают вероятность нарушения существующего кода несуществующим или очень низким. Примеры первых: 'in',' out' и более поздних: 'yield',' async', 'await',' var' и т. Д. – InBetween

Смежные вопросы