TransWikia.com

Implementar interfaz genéricas con métodos con parámetros de entrada genéricos

Stack Overflow en español Asked by Jolu7432 on November 27, 2021

buenas tardes, tengo un problema al tratar de implementar una interfaz con genéricos.
Es algo relacionado con Covarianza y Contravarianza pero no lo logro entender. Dejo un ejemplo del código para ver si se entiende lo que quiero lograr.
No logro entender porque no me deja realizar esta asignacion “IFoo aux = metal;” y si, si el genérico de la interfaz lo pongo como salida.


public class Program
{
    public class Member : IEntity
    {
        public int Id { get; set; }
    }

    public class Order : IEntity
    {
        public int Id { get; set; }
    }

    public interface IEntity
    {
        int Id { get; set; }
    }

    // Aqui es donde si pongo el generico como out me deja agregarlo tranquilamente a la lista
    // o asignarlo a la variable IFoo<IEntity> Ej:
    //public interface IFoo<out T> where T : class, IEntity
    public interface IFoo<T> where T : class, IEntity
    {
        bool Run(T entity);
    }

    public class Metal : IFoo<Member>
    {
        public bool Run(Member entity)
        {
            throw new NotImplementedException();
        }
    }

    public class Platico : IFoo<Order>
    {
        public bool Run(Order entity)
        {
            throw new NotImplementedException();
        }
    }

    static void Main(string[] args)
    {
        var metal = new Metal();
        metal.Run(new Member());

        var platico = new Platico();
        platico.Run(new Order());

        List<IFoo<IEntity>> list = new List<IFoo<IEntity>>();

        //Porque no me deja agregar el objecto a la lista.
        list.Add(metal);

        // En su defecto esto tambien me tira error.
        IFoo<IEntity> aux = metal;

        //Porque no me deja agregar el objecto a la lista.
        list.Add(platico);

        // En su defecto esto tambien me tira error.
        IFoo<IEntity> aux = platico;
    }
}

========================================================================

One Answer

Creo que el problema lo tienes en que hay que hacer un casting antes. Y mira que en tu aplicación declaras dos veces la variable aux. En el ejemplo la segunda la he renombrado.

static void Main(string[] args)
{
    var metal = new Metal();
    metal.Run(new Member());

    var platico = new Platico();
    platico.Run(new Order());

    List<IFoo<IEntity>> list = new List<IFoo<IEntity>>();

    //Porque no me deja agregar el objecto a la lista.
    // * Has de hacer un cast para poderlo añadir
    list.Add((IFoo<IEntity>)metal);

    // En su defecto esto tambien me tira error.
    // * Con el cast ya no arroja error.
    IFoo<IEntity> aux = (IFoo<IEntity>)metal;

    //Porque no me deja agregar el objecto a la lista.
    // * Has de hacer un cast previo
    list.Add((IFoo<IEntity>)platico);

    // En su defecto esto tambien me tira error.
    // * La variable aux ya la tienes declarada arriba, la he nombrado
    // * y he puesto el cast (IFoo<IEntity>) y ya no arroja error.
    IFoo<IEntity> aux2 = (IFoo<IEntity>)platico;
}

Answered by Antonio S.F. on November 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP