Ask most C# developers what you can await and the answer is "a Task". That is the common case, but it is not the rule. await is resolved the same way foreach is: structurally. The compiler looks for a shape, and Task happens to have it. Knowing the shape is what makes the next post, on the generated state machine, readable. It also lets you write awaitables of your own, which is occasionally very useful.… [read more]