Avatar ·

¿Cuál es la diferencia entre Func, Action y Predicate en C#? ¿Cuándo usar cada uno?

¡Hola, colegas! Recientemente comencé a estudiar C# y me topé con los delegados incorporados: Func, Action y Predicate. Parecen similares — son delegados genéricos, pero me confundo sobre cuándo usar cada uno.

Entiendo que todos permiten pasar métodos como parámetros, pero sus firmas son diferentes. Por ejemplo, he visto código así:

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 los tres aceptan argumentos y hacen algo. Pero ¿por qué para verificar si un número es par se usa Predicate y no Func<int, bool>? ¿Y para qué sirve Action si se puede usar Func con tipo de retorno void?

Por favor, indíquenme cuál es la diferencia fundamental entre estos tres tipos de delegados y cómo elegir el correcto en un caso específico.