Поскольку Javascript - это язык, на котором я наиболее опытный, я знаком с использованием функций как объектов первого класса. Я думал, что С# не хватало этой функции, но потом я услышал о Func
и Action
и delegate
, которые, я думаю, довольно awesomesauce.
Например, вы можете объявить Func
, который объединяет две строки и помещает пробел между ними следующим образом:
Func<string, string, string> concat = (a,b) => a + " " + b;
Я заметил, что когда вы печатаете
Func<
IntelliSense показывает, что он имеет 17 перегрузок:
delegate System.Func<out TResult>
delegate System.Func<in T, out TResult>
delegate System.Func<in T1, in T2, out TResult>
...snip...
delegate System.Func<in T1, in T2, in T3, in T4, in T5, in T6, in T7, in T8, in T9, in T10, in T11, in T12, in T13, in T14, in T15, in T16, out TResult>
Это заставило меня рассмеяться. Я просмотрел документы MSDN для Func
и снова засмеялся. Это заставило меня попытаться объявить Func
с 17 аргументами. Это вызывает ошибку (Using the generic type 'System.Func<TResult>' requires 1 type arguments
).
Я могу согласиться с тем, что, вероятно, не рекомендуется иметь Func
, который принимает более 16 аргументов. Тем не менее, это похоже на kludgy путь для Func
для реализации. Для документирования требуется 17 тривиально разных перегрузок. Это все, что ему действительно нужно знать: последний тип параметра - это тип возвращаемого значения, и все параметры типа перед ним являются типами аргументов.
Итак, что я мог сделать, если бы хотел создать Func
с более чем 16 параметрами? Почему в любом случае существует предел? Почему С# не позволяет вам объявить Func
с произвольным числом аргументов?