Почему анонимные делегаты опускают аргументы, но лямбда не могут?
//ok
Action<int> CallbackWithParam1 = delegate { };
//error CS1593: Delegate 'System.Action<int>' does not take 0 arguments
Action<int> CallbackWithParam2 = () => { };
Просто интересно, почему расхождение действительно.: -/
Ответ 1
Джаред, конечно, прав. Чтобы добавить пару более подробной информации:
Почти никто не использует синтаксис "пропустить список параметров".
У нас нет сценария для лямбда, для которого требуется эта функция.
Эта функция усложняет разрешение вывода и перегрузки по типу и делает более вероятным, что оба из них будут терпеть неудачу.
Какой синтаксис вам понравится? Action<int> c = => {};??? У меня нет никакого желания сделать => в унарный префиксный оператор.
Итак, с одной стороны, у нас есть список профи:
Lambdas набирает согласованность с ненужной функцией С# 2.0, которую вряд ли кто-либо знает или использует - особенность, которая, откровенно говоря, мы бы никогда не сделали в первую очередь
и минусы:
Реализация
усложняет алгоритмы вывода и алгоритмов определения сложного типа
Функция
приводит к большему количеству ошибок для пользователей без соответствующего усиления репрезентативной мощности.
нет явно приятного синтаксиса
Если бы вам дали список плюсов и минусов, что бы вы сделали? Я надеюсь, что "реализовать функцию" не будет вашим выбором; это не наш.
Ответ 2
Это по сути так же просто, как и разные функции с различными наборами поддерживаемых сценариев. Это почти похоже на вопрос
Почему lambdas может быть выражением, но делегаты могут быть только блоками?