#1,156 – Covariance and Generic Delegate Types
August 8, 2014 1 Comment
As with generic interfaces, generic delegate types are covariant if you mark output parameters as out.
In the example below, we’re unable to assign an instance of ReturnDelegate<Terrier> to ReturnDelegate<Dog>. The delegate type is not covariant.
public delegate T ReturnDelegate<T>(); public static Terrier GenerateTerrier() { return new Terrier("Bubba"); } static void Main(string[] args) { ReturnDelegate<Terrier> del = GenerateTerrier; // Error: Cannot implicitly convert ReturnDelegate<Terrier> // to ReturnDelegate<Dog> ReturnDelegate<Dog> del2 = del; }
We can get the delegate type to behave covariantly by marking its type parameter with the out keyword.
public delegate T ReturnDelegate<out T>();
We can now assign an instance of ReturnDelegate<Terrier> to a variable of type ReturnDelegate<Dog>.