que tienen una rutinaC# pasar una colección de objetos InterfaceImplementingClass a una rutina que lleva una colección de interfaz .NET objetos
public void SomeRoutine(List<IFormattable> list) { ... }
entonces trato de llamar a esta rutina
List<Guid>list = new List<Guid>();
list.Add(Guid.NewGuid());
SomeRoutine(list);
y falla con un error en tiempo de compilación. System.Guid implementa IFormattable, pero el error que consigo es
no se puede convertir de 'System.Collections.Generic.List' a 'System.Collections.Generic.List'
NOTA : Obtendrá el mismo error si solo usa una matriz de Guids. Los genéricos NO son la causa ...
¡Pero! Dada esta
public void SomeRoutine2(IFormattable obj) { ... }
y esto
Guid a = Guid.NewGuid();
SomeRoutine2(a);
Compila! Entonces la pregunta es ¿POR QUÉ? ¿Por qué puedo pasar un objeto Guid (que implementa IFormattable) a una rutina que acepta un objeto de IFormattable, pero cuando intento expandirlo a una colección (una lista genérica, una matriz o cualquier otra cosa), obtengo un error de conversión?
Me ha costado encontrar una respuesta, y pensé que sería el mejor lugar para ir.
Te das cuenta de que la respuesta marcada (covarianza .NET 4.0) en realidad no se aplica a las listas, donde-como genéricos funciona * ahora *? –
Vea también: http://marcgravell.blogspot.com/2009/02/what-c-40-covariance-doesn-do.html –
Excepto que no funcionó con una matriz de Guids con una rutina que está buscando una matriz de IFormattable, ya sea ...? – emkayultra