C# · Avançado · Português · Técnico
covariância e contravariância
Regras que permitem usar um tipo genérico mais derivado (out, covariância) ou mais base (in, contravariância) no lugar do declarado, em interfaces e delegates genéricos.
Onde usar
Explica por que IEnumerable<string> converte para IEnumerable<object>, mas List<string> não converte para List<object>. Aparece ao declarar interfaces próprias com out T ou in T.
Em código
IEnumerable<string> s = new List<string>();
IEnumerable<object> o = s; // covariância
Action<object> fo = x => { };
Action<string> fs = fo; // contravariância
// invariante, não compila:
// List<object> l = new List<string>();Exemplos
O IEnumerable é covariante, por isso aceito uma lista de string onde se espera object.
Action<object> serve como Action<string> graças à contravariância.
Cuidado
A variância só vale para interfaces e delegates e só com tipos por referência; não se aplica a classes nem a tipos por valor.
Sinônimos
variância
Antônimos
invariância