📊 Capítulo 12: Generics & Variância
Especialização em Sistemas com C#
🗺️ Covariância (out) vs Contravariância (in) em Interfaces C#
flowchart LR
subgraph COVARIANCE ["Covariância: out T (Preserva a relação de subtipo / Somente Saída)"]
CO_DEF["public interface IProdutor<out T> { T Obter(); }"]
CO_USE["IProdutor<Cachorro> c = ...;\nIProdutor<Animal> a = c; (VÁLIDO! Todo Cachorro é um Animal) ⚡"]
end
subgraph CONTRAVARIANCE ["Contravariância: in T (Inverte a relação de subtipo / Somente Entrada)"]
CT_DEF["public interface IConsumidor<in T> { void Processar(T item); }"]
CT_USE["IConsumidor<Animal> a = ...;\nIConsumidor<Cachorro> c = a; (VÁLIDO! Quem consome Animal pode consumir Cachorro!) 🛡️"]
end
style COVARIANCE fill:#ede7f6,stroke:#512da8,stroke-width:2px
style CONTRAVARIANCE fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
🎯 Slide 1: Constraints de Tipos Genéricos (where T : ...)
where T : class(Apenas reference types)where T : struct(Apenas value types não-nulos)where T : notnull(Garante tipo não-nulo no C# 8+)where T : new()(Exige construtor público sem parâmetros)where T : EntidadeBase, IComparable<T>
🎯 Slide 2: Generics no .NET Não Sofrem Erasure!
-
Ao contrário do Java (onde tipos genéricos são apagados em bytecode pelo Type Erasure), na CLR do .NET os generics são reificados:
List<int>aloca diretamente inteiros contíguos sem boxing! A performance deList<int>é idêntica à de um array primitivo nativo!
🎯 Slide 3: Métodos Genéricos com Dedução
public static T CriarOuPadrao<T>(Func<T> fabrica) where T : class
{
return fabrica() ?? throw new InvalidOperationException();
}
🔗 Navegação do Capítulo 12
| 📖 Ler Conteúdo Completo | 🧠 Fazer Quiz | 💻 Ver Exemplos | 🧩 Exercícios |
Slide 1 de 1
Atalhos: ← → Navegar • Espaço Avançar • F Tela Cheia • Home Início • End Fim