Having studied Haskell and F# and done a lot of C# coding in functional style I realize that “void” declaration in C-family of languages is a bug in the type system.
It appears where a type should be, but is in fact an instruction to forget everything you know and hold dear and treat the calls to this function differently.
Enter Action vs Func<Unit> distinction. What it comes down to is that you have to duplicate all the code that works for Func<> to get its functionality for methods that don’t have a value to return.
.ForEach() doesn’t have to exist and yet, there’s gazillion implementations floating around for something that could have been implemented (once) as something like a fold().
.NET 3.5 should have included and promoted Unit type.
/rant