Pasando una lista de una interfaz a una función en c#
Tengo 2 objetos y una interfaz mutua. Luego tengo una función que acepta una lista de IMyInterface. Si llamara a esta función usando List
Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.
davy.ai
La razón por la que esto funciona para
IEnumerable
y no paraList
se debe a las diferencias en sus comportamientos en relación con la covarianza y contravarianza.IEnumerable
se considera covariante, lo que significa que permite conversiones implícitas del parámetro de tipo a un tipo más derivado, lo que hace posible que unList<myclass1>
oList<myclass2>
se pase como argumento aMyFunction(IEnumerable<imyinterface> myObjects)
ya que tantoMyClass1
comoMyClass2
implementanIMyInterface
.Por otro lado,
List
se considera invariante y no permite conversiones implícitas del parámetro de tipo. Esto significa que aunqueMyClass1
yMyClass2
implementenIMyInterface
, unList<myclass1>
oList<myclass2>
no se puede pasar como argumento aMyFunction(List<imyinterface> myObjects)
.Para hacer que
List
se comporte covariantemente, podemos usar la palabra claveout
para indicar que el parámetroIMyInterface
se utiliza solo para salida, de esta manera:Esto permite conversiones implícitas del parámetro de tipo, haciendo posible pasar un
List<myclass1>
oList<myclass2>
como argumento. Sin embargo, también significa quemyObjects
solo se puede utilizar como parámetro de salida y no como parámetro de entrada.