Links
Variance allows to replace a type with a less-derived (covariance: derived → base) type or a more-derived type (contravariance: base → derived).
Covariance enable implicit reference conversion for array types, delegate types, and generic type arguments.
Covariance preserves assignment compatibility and contravariance reverses it.
 |
Since .NET Framework 4, C# supports covariance and contravariance in generic interfaces and delegates and allows for implicit conversion of generic type parameters. |
Assignment compatibility
Allow an object of a more derived type (child class, ex: string) to be assigned to an object of a less derived type (parent class, ex: object).
|
string s = "test";
object o = s;
|
Covariance
Allow a generic object of child class type (ex: string) to be assigned to a generic object of parent class type (ex: object).
 |
It works only with covariant interface |
|
var deriveds = new List<Derived>();
List<Base> bases = strings;
IList<Base> bases = strings;
IEnumerable<object> bases = deriveds;
IReadOnlyList<Base> bases = deriveds;
IReadOnlyCollection<Base> bases = deriveds;
var objects = (IList<object>)strings;
|
Native covariant interfaces
Interface
|
Since
|
IEnumerable<out T> |
.NET Framework 4.0
|
IReadOnlyList<out T> |
.NET Framework 4.5
|
IReadOnlyCollection<out T> |
.NET Framework 4.5
|