Avatar ·

Qual é a diferença entre Func, Action e Predicate em C#? Quando usar cada um?

Olá, colegas! Recentemente comecei a estudar C# e me deparei com os delegates embutidos: Func, Action e Predicate. Eles parecem ser todos semelhantes — são delegates genéricos, mas estou confuso sobre quando usar cada um.

Eu entendo que todos permitem passar métodos como parâmetros, mas suas assinaturas são diferentes. Por exemplo, vi este código:

Func<int, int, int> add = (x, y) => x + y;
Action<string> print = s => Console.WriteLine(s);
Predicate<int> isEven = x => x % 2 == 0;

Parece que todos os três aceitam argumentos e fazem algo. Mas por que para verificar paridade se usa Predicate em vez de Func<int, bool>? E para que serve Action se podemos usar Func com tipo de retorno void?

Por favor, me expliquem qual é a diferença fundamental entre esses três tipos de delegates e como escolher o correto em uma situação específica.