Using a generic type as a return type of an async method
.net, async-await, c#, generics
Solution
Three problems:
Just because `T` is "`Task` or a derived type" doesn't mean that it's `Task` or `Task<T>`. What would you expect if I called `MyMethodAsync<MyCustomTask>` where `MyCustomTask` derives from `Task`?
The compiler needs to know whether it's building a state machine returning `Task` or `Task<T>` when it compiles the method - it uses different helper classes in the different cases
If an async method has a return type of `Task`, any `return` statements can't specify a value; if it has a return type of `Task<T>` any `return` statements must specify a value which is implicitly convertible to `T`. How can that work within `MyMethodAsync`? It's a bit like saying "my method is either `void` or returns a `T` - you can decide when you call it".
It's not clear what you're trying to achieve here, but basically this isn't going to work.
Problem
A previous question made me wonder why the following method would raise a compile time error: The return type of an async method must be void, Task or Task ``` public async T MyMethodAsync<T>() where T : Task { // Irrelevant code here which returns a Task } ``` Since we know at compile time that T is always a `Task` or a derived type, why won't this work? Edit The reason I'm asking is that a method may return a `Task` or a `Task<T>`. Let's say the method can return either and I don't want to duplicate code. Of course this is all theoretical and isn't ment for production purposes. Edit 2 Found a great article by Lucian Wischik: Why must async return Task