A Predicate is just a Func which returns a boolean:
Predicate<T1, T2, T3, ...,Tn> = Func<T1, T2, T3, ...,Tn, bool>
And an Action is just a Func which doesn’t return a value:
Action<T1, T2, T3, ...,Tn> = Func<T1, T2, T3, ...,Tn, void>
My question: Do Predicates or Actions have any additional properties or qualities which differentiate them to Funcs?
Nope. None whatsoever. They are all just delegate types. The only distinction is that some methods take things like
Predicate<T>(mainly older APIs), and some take theFunc<>/Action<>. One advantage of theFunc<>/Action<>approach is that the signature is obvious from the name (i.e. aFunc<int,float,string>takes anintand afloat, and returns astring), but that’s it. And even if the delegates have the same signature, they are not directly interchangeable (you can’t pass aFunc<T,bool>instance into a method that takesPredicate<T>).