void in C# generics?
You cannot use void
, but you can use object
: it is a little inconvenience because your would-be-void
functions need to return null
, but if it unifies your code, it should be a small price to pay.
This inability to use void
as a return type is at least partially responsible for a split between the Func<...>
and Action<...>
families of generic delegates: had it been possible to return void
, all Action<X,Y,Z>
would become simply Func<X,Y,Z,void>
. Unfortunately, this is not possible.
No, unfortunately not. If void
were a "real" type (like unit
in F#, for example) life would be a lot simpler in many ways. In particular, we wouldn't need both the Func<T>
and Action<T>
families - there'd just be Func<void>
instead of Action
, Func<T, void>
instead of Action<T>
etc.
It would also make async simpler - there'd be no need for the non-generic Task
type at all - we'd just have Task<void>
.
Unfortunately, that's not the way the C# or .NET type systems work...
Here is what you can do. As @JohnSkeet said there is no unit type in C#, so make it yourself!
public sealed class ThankYou {
private ThankYou() { }
private readonly static ThankYou bye = new ThankYou();
public static ThankYou Bye { get { return bye; } }
}
Now you can always use Func<..., ThankYou>
instead of Action<...>
public ThankYou MethodWithNoResult() {
/* do things */
return ThankYou.Bye;
}
Or use something already made by the Rx team: http://msdn.microsoft.com/en-us/library/system.reactive.unit%28v=VS.103%29.aspx