C# Language invarianza


Esempio

IList<T> non è mai un sottotipo di un diverso IList<T1> . IList è invariante nel suo parametro di tipo.

class Animal { /* ... */ }
class Dog : Animal { /* ... */ }

IList<Dog> dogs = new List<Dog>();
IList<Animal> animals = dogs;  // type error

Non esiste una relazione di sottotipo per gli elenchi poiché è possibile inserire valori in un elenco e ricavare valori da un elenco.

Se IList fosse covariante, saresti in grado di aggiungere elementi del sottotipo sbagliato a una data lista.

IList<Animal> animals = new List<Dog>();  // supposing this were allowed...
animals.Add(new Giraffe());  // ... then this would also be allowed, which is bad!

Se IList fosse controverso, saresti in grado di estrarre i valori del sottotipo errato da una lista data.

IList<Dog> dogs = new List<Animal> { new Dog(), new Giraffe() };  // if this were allowed...
Dog dog = dogs[1];  // ... then this would be allowed, which is bad!

I parametri di tipo invariante sono dichiarati omettendo sia le parole chiave in e out .

interface IList<T> { /* ... */ }