Variance
De Banane Atomic
Aller à la navigationAller à la recherche
Links
Description
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 strings = new List<string>(); List<object> objects = strings; // Cannot convert type List<string> to List<object> because List<T> is invariant IList<object> objects = strings; // Cannot implicitly convert type List<string> to IList<object> because IList<T> is invariant IEnumerable<object> objects = strings; // IEnumerable<T> is covariant 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 |