Действие по определению не возвращает значение, вы можете использовать универсальную версию, которая допускает несколько параметров.
Если вы хотите, чтобы он возвращал значение, используйте Func или если вы просто хотите, чтобы он возвращал bool и принимал один аргумент, вы можете использовать Predicate
Или вы можете определить делегат так, как вам нравится, возвращать void или значение и принимать любое количество аргументов. Вы можете определить делегата как ниже, и это как тип, который вы можете использовать. Затем вы можете передать его в качестве параметра обратного вызова напрямую, не используя Action, Func или Predicate. Пользовательский делегат также широко используется при написании пользовательских многоадресных обработчиков событий.
public delegate double PerformAverageEventHandler(int val1, int val2, int val3);