es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 o List obtendría un error diciendo que no se puede convertir List a List. Sin embargo, si cambiara la firma de mi función a IEnumerable, ya no habría un error. Mi pregunta es ¿por qué esto funciona para IEnumerable y no para una List concreta?

Tags:  ,

Answer

  1. Avatar for davy.ai

    La razón por la que esto funciona para IEnumerable y no para List 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 un List<myclass1> o List<myclass2> se pase como argumento a MyFunction(IEnumerable<imyinterface> myObjects) ya que tanto MyClass1 como MyClass2 implementan IMyInterface.

    Por otro lado, List se considera invariante y no permite conversiones implícitas del parámetro de tipo. Esto significa que aunque MyClass1 y MyClass2 implementen IMyInterface, un List<myclass1> o List<myclass2> no se puede pasar como argumento a MyFunction(List<imyinterface> myObjects).

    Para hacer que List se comporte covariantemente, podemos usar la palabra clave out para indicar que el parámetro IMyInterface se utiliza solo para salida, de esta manera:

    public void MyFunction(List<out imyinterface=""> myObjects) { ... }
    

    Esto permite conversiones implícitas del parámetro de tipo, haciendo posible pasar un List<myclass1> o List<myclass2> como argumento. Sin embargo, también significa que myObjects solo se puede utilizar como parámetro de salida y no como parámetro de entrada.

Comments are closed.