ExpertiDict

C# · Avançado · Português · Técnico

covariância e contravariância

/ko.va.ɾi.ˈɐ̃.si.a i kõ.tɾa.va.ɾi.ˈɐ̃.si.a/substantivo

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

Veja também

Todos os termos de C#