Подтвердить что ты не робот

Почему анонимные делегаты опускают аргументы, но лямбда не могут?

//ok
Action<int> CallbackWithParam1 = delegate { };    

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

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

4b9b3361

Ответ 1

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

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

Итак, с одной стороны, у нас есть список профи:

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

и минусы:

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

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

Ответ 2

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

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