C# does not allow variance on classes, only interfaces and delegates that are parameterized with reference types. Task<T>
is a class.
This is somewhat unfortunate, as Task<T>
is one of those rare classes that could be made safely covariant.
However it is easy enough to convert a Task<Derived>
to a Task<Base>
. Just make a helper method / lambda that takes a Task<Derived>
and returns Task<Base>
, await the passed-in task, and return the value cast to Base
. The C# compiler will take care of the rest. Of course you lose referential identity, but you weren’t ever going to get that with a class.