Академический Документы
Профессиональный Документы
Культура Документы
n Genericidad
Tengo que hacer un cast para recuperarlo tal cual, lo que me puede dar excepcin
cturas Genericas
faces y Genericidad
ericidad Restringida
Garantiza que el tipo T tenga que se IComparable Y por tanto este cdigo es estticamente correcto
Perro[] perros = new Perro[5]; Gato[] gatos = new Gato[4]; ... Excepcin Animal[] animales = perros; Gato Tom = new Gato(); animales[2] = Tom; animales[1].Come(); Qu debe ocurrir?
Perr o
(Ladra)
Gato
(Maulla )
animales[2].Ladra(); No se puede meter un gato en un array que realmente es de perros. Los arrays son covariantes pero no de manera segura
ucturas genricas
C#1. 0 ArrayList a = new ArrayList(); a.Add("rojo"); a.Add("azul"); a.Add("blanco"); a.Add(100);
Posible intruso
C#2. 0 List<string> a = new List<string>(); a.Add("rojo"); a.Add("azul"); a.Add("blanco"); a.Add(100); ERROR de COMPILACIN string color = a[1]; No hay que hacer Cast, el compilador sabe que el tipo de a[1] es string
ucturas genricas
C#2. class List<T> { 0 ... Parmetro genrico
genrico Uso del parmetro genrico Uso ... del parmetro public void Add(T x){ }
C#2. 0 List<Perros> misPerros = new List<misPerros>(); List<Animal> misMascotas = misPerros; Gato Tom = new Gato();
Se permite o no se permite?
Perro
(Ladra )
Gato
(Maull a)
C#2.0 es MUY restrictivo, esta asignacin Covariante NO se permite (ERROR de Compilacin) Cmo ser menos restrictivo sin perder proteccin?
Por lo tanto no puede haber ninguna operacin sobre un IEnumerable que provoque un cambio en algn T por un descendiente de T
New features in C# 4.0, Mads Torgersen MSDN, video PDC, Object Oriented Software Construction, Bertrand Meyer Covariance and Contravariance in C#, Eric Lippert's Blog