2015-06-20 1 views
3

Я изучаю анонимные методы, лямбды и т.д., и не может найти причину, почему она не работает здесь:Почему этот анонимный метод не работает во время лямбды?

// this does not work 
MyDictionary.Keys.Where(delegate(string s) { s.Length == 5; }); 

// this works 
MyDictionary.Keys.Where(w => w.Length == 5); 
+0

Заявление lambdas, подобно анонимным методам, не может использоваться для создания деревьев выражений. –

+0

@AmitKumarGhosh Правильное, но не релевантное здесь. Этот вопрос будет использовать 'Enumerable.Where' (взятие делегата), а не' Queryable.Where' (взятие дерева выражений). – hvd

+1

«не работает здесь» недостаточно информации. Вы всегда должны * включать сообщение об ошибке, которое вы получаете. –

ответ

11

Вы забыли return результат утверждения:

MyDictionary.Keys.Where(delegate(string s) { return s.Length == 5; }); 

Думай о delegate, как полный метод, который должен быть как можно более независимым, за исключением части именования. Таким образом, вы можете себе представить, как:

delegate(string s) { 
    // you would need to return something here: 
    return s.Length == 5; 
} 

UPDATE:

Кроме того, подумайте об этих 2 лямбды:

MyDictionary.Keys.Where(w => w.Length == 5); // works 
MyDictionary.Keys.Where(w => { w.Length == 5 }); // does not work 

Почему второй один не работает? Подумайте об этом, чтобы получить лучшее представление о том, что происходит. Это просто упрощение изображения:

Первый лямбда-это утверждение: w.Length == 5, и инструкция имеет результат, который возвращает его на самом деле. Не правда ли?

Но второй: { w.Length == 5 } - это блок. И блок ничего не возвращает, за исключением того, что вы явно это делаете.

+0

Второй образец лямбда не компилируется. Механизм здесь - это не разностное выражение vs block само по себе, а специальное правило лямбда, которое обрабатывает голые выражения по-разному. –

+0

@HenkHolterman 'Второй образец лямбда не компилируется' -> Я упомянул, что' не работает'. Остальное: Благодаря этому, я просто пытаюсь упростить картину. Я учитель, и по моему опыту большинство людей нуждается в чистой и простой картине, чтобы начать понимать. Еще раз спасибо. –

+0

Он просто пропускает ';' (для компиляции, но все еще не работает). –

1

Вы должны поставить return заявления в теле делегата, как это:

MyDictionary.Keys.Where(delegate(string s) { return s.Length == 5; }); 

Вы можете вещь как return будучи своего рода подразумеваемой стрелки в версии лямбды, поэтому он за работой.

+3

Это подразумевается, но не по стрелке. Когда вы пишете 'w => {w.Length == 5;}', у вас такая же проблема. –

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

  • Нет связанных вопросов^_^