Поскольку Javascript - это язык, в котором я наиболее разбираюсь, я знаком с использованием функций как первоклассных объектов. Я думал, что в C # не хватает этой функции, но потом я услышал о Func
и Action
и delegate
, которые, на мой взгляд, довольно крутые.
Например, вы можете объявить Func
, которая объединяет две строки и помещает между ними пробел, например:
Func concat = (a,b) => a + " " + b;
Я заметил, что когда вы набираете
Func<
, IntelliSense показывает, что у него 17 перегрузок. :
delegate System.Func
delegate System.Func
delegate System.Func
...snip...
delegate System.Func
Это меня рассмешило. Я просмотрел документы MSDN для Func
и снова засмеялся. Это заставило меня попытаться объявить Func
с 17 аргументами. Это вызывает ошибку ( Использование универсального типа 'System.Func
).
Я могу согласиться с тем, что, вероятно, не рекомендуется иметь Func
, которая принимает более 16 аргументов. Даже в этом случае это кажется громоздким способом реализации Func
. Для этого требуется документировать 17 тривиально различных перегрузок. Это все, что ему действительно нужно знать: последний параметр типа - это возвращаемый тип, а все параметры типа перед ним - это типы аргументов.
Итак, что я мог сделать, если бы хотел создать Func
с более чем 16 параметрами? Почему вообще есть лимит? Почему C # не может просто позволить вам объявить Func
с произвольным числом аргументов?