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
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.
See more on this question at Stackoverflow