class Pojazd{}; class Auto : Pojazd{}; class Audi : Auto{};
class Pojazd { }; class Auto : Pojazd { static Auto GetAuto() { return new Auto(); } Pojazd pojazd = GetAuto(); Auto auto = GetAuto(); }; class Audi : Auto { };A więc kowariancja pozwala do obiektu z klasy Pojazd przypisać obiekt typu Auto. Nie można jednak przypisać obiektu typu Audi, ponieważ nie zawsze obiekt zwracany musi być typu Audi.
public class Pojazd { }; public class Auto : Pojazd { public Auto Metoda(Auto auto) { return new Auto(); } void Program() { Metoda(new Auto()); Metoda(new Audi()); } }; public class Audi : Auto { };A więc kontrawariancja pozwala na odwołanie się do bardziej precyzyjnego typu, czyli do parametru typu Auto możemy odwołać się typem dziedziczący po nim a więc Audi. Nie możemy natomiast odwołać się do typu nadrzędnego a więc do typu Pojazd, ponieważ nie każdy pojazd to samochód.
private IEnumerable<Auto> Metoda() { return null; } IEnumerable<Pojazd> listaPojazd = Metoda(); // Błąd - typy generyczne nie są kowariancją w C# 3.0 IEnumerable<Auto> listaAuto = Metoda(); // OK IEnumerable<Audi> listaAudi = Metoda(); // Błąd - typy generyczne nie są kontrawariancją w C# 3.0
private IEnumerable<Auto> Metoda() { return null; } IEnumerable<Pojazd> listaPojazd = Metoda(); // OK IEnumerable<Auto> listaAuto = Metoda(); // OKAby zapewnić obsługę kowariancji w C# 4.0 należy użyć słowa kluczowego out w deklaracji interfejsu.
public interface IEnumerable<out T>Możliwe staje się wówczas przypisanie:
IEnumerable<Pojazd> listaPojazd = new Auto();Natomiast, aby zdefiniować kontrawariancje należy użyć słowa kluczowego in w deklaracji interfejsu.
public interface IJakisInterfejs<in T>Możliwe staje się wówczas przypisanie:
public IJakisInterfejs<Auto> Metoda() { return null; } IJakisInterfejs<Auto> listaAut = Metoda(); IJakisInterfejs<Audi> listaAudi = Metoda();W C# 3.0 była możliwość korzystania z kontra i kowariancji w zwykłych metodach oraz delegatach, jednak nie było możliwości korzystania w kowariancji oraz kontrawariancji przy użyciu typów generycznych.