Почему анонимные делегаты могут опускать аргументы, а лямбды не могут? - PullRequest
19 голосов
/ 16 февраля 2012
//ok
Action<int> CallbackWithParam1 = delegate { };    

//error CS1593: Delegate 'System.Action<int>' does not take 0 arguments
Action<int> CallbackWithParam2 = () => { };   

Просто удивлялся, почему это несоответствие действительно. : - /

Ответы [ 2 ]

16 голосов
/ 16 февраля 2012

Джаред, конечно, прав.Чтобы добавить еще пару деталей:

  • Почти никто не использует синтаксис "пропустить список параметров".
  • У нас нет сценария для лямбд, что требует , чтоfeature.
  • Эта функция усложняет вывод типов и разрешает перегрузку и повышает вероятность того, что оба сбоят.
  • Какой синтаксис вы хотели бы использовать для этой функции?Action<int> c = => {}; ???У меня нет никакого желания превращать => в унарный префиксный оператор.

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

  • Лямбды получают согласованность сненужная функция C # 2.0, о которой вряд ли кто-то знает или использует - откровенно говоря, мы хотели бы, чтобы мы никогда не делали в первую очередь

и минусы:

  • приводит к большим возможностям ошибок для пользователей без соответствующего усиления в представительной мощности.
  • без явно приятного синтаксиса

Если бы вам дали этот список плюсов и минусов, что бы вы сделали?Я надеюсь, что «реализовать функцию» не будет вашим выбором;это был не наш.

6 голосов
/ 16 февраля 2012

По сути, это так же просто, как разные функции с разными наборами поддерживаемых сценариев. Это почти как спрашивать

Почему лямбды могут быть выражениями, а делегаты могут быть только блоками?

...