Aller au contenu

Variance

De Banane Atomic

Links

Description

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 there is no covariance with List<T>
IList<object> objects = strings;  // Cannot implicitly convert type List<string> to IList<object>. An explicit conversion exists

IEnumerable<object> objects = strings; // There is covariance with IEnumerable<T>

var objects = (IList<object>)strings; // There is covariance with IList<T>