The reason behind making awaitables a struct is to avoid unnecessary heap allocations and minimize the memory footprint when the compiler creates the state machine behind the scenes.
This is an implementation detail. It is not necessary for an awaitable to be of type struct
and not a class
. To strengthen this statement, try compiling an async method in Roslyn in Debug
mode, and you'll see the state-machine is a class, where-as compiling in Release
will result in a struct
. More on that in Why are async state machines classes (and not structs) in Roslyn?