... поскольку делегаты Func или Action ограничены четырьмя параметрами ...
Начиная с .NET 4.0, эти типы делегатов определены для примерно до 17 параметров,Вы также можете определить свой собственный довольно просто для любого произвольного числа параметров;Например, ниже я определяю делегата, который принимает 5 параметров:
public delegate void Action<T1, T2, T3, T4, T5>(T1 arg1, T2 arg2, T3 arg3, T4 arg4, T5 arg5);
Что вы думаете по этому поводу?
Это совершенно нормально.Верьте или нет, разработчики .NET делают это все время.
Это зло и его следует избегать для всех, кроме очень особых ситуаций?
Нет, это довольно мягко,В этом нет ничего страшного.
Как это производительность?Будет ли создаваться новая функция bar каждый раз, когда она вызывается, или компилятор каким-то образом ее оптимизирует?
Производительность довольно хорошая.Компилятор определит фактический полноценный тип CLR для предоставления анонимного метода, точно так же, как он определяет полноценные типы CLR для анонимных типов и для методов, использующих ключевое слово yield
.Не волнуйся;анонимные методы не требуют динамической компиляции при каждом вызове!На самом деле, это было бы довольно абсурдно, если подумать.
Это даже не то, что я бы назвал "оптимизацией";это просто способ, которым анонимные методы реализуются компилятором.