Task or Task
It is best answered in Lucian Wischik's blog post Why must async methods return Task?
In summary (and I am not doing the blog post justice, you should read it), the issue is that Task
already exists, so introducing an interface would mean
Task
or the interface, a decision that doesn't matter much. Task
.The impact from the above is so massive that it doesn't make sense to provide an interface.
I think the main reason is what you stated in point #1
instance method or extension method
Simply, because they want to enable the user to make an object Awaitable by defining an extension method for it, hence, you can make an object Awaitable even if you don't own it.
Checkout this article
This is in line with what they did for the foreach
keyword (see section 8.8.4 of the C# language specification "The foreach statement").
Basically, it's duck-typing; if the type implements a MoveNext
method and a Current
property, that's all that's needed for the C# compiler to know how to iterate through a sequence exposed by an object.
This also applies with collection initializers (see section 7.6.10.3 of the C# language specification "Collection Initializers"); the only requirement is that the type implements the System.Collections.IEnumerable interface and have an Add
method.
That said, the await keyword just sticks to prior precedent, not requiring specific interface implementations (although the interfaces supply those methods if you choose to use them), just a pattern of methods that the compiler can recognize.