如何将泛型的具体实现分配给泛型列表

时间:2018-08-17 04:28:28

标签: c#

我一直在试图理解以下内容为什么会生成编译错误,以及如何解决该错误。

public interface IA { }
public class AImp : IA { }

public interface IConsumer<T> where T : IA
{
    void Consume(T val);
}

public class Consumer : IConsumer<AImp>
{
    public void Consume(AImp val)
    {
        // do smth
    }
}

public class Program
{
    public static void Main()
    {
        IList<IConsumer<IA>> l1 = new List<IConsumer<IA>>();
        l1.Add(new Consumer());  // generate compile error cannot convert from consumer to IConsumer<IA>

    }
}

如果我可以创建IList<IA> l = new List<IA>();并赋值l.Add(new AImp());,则看不到泛型类型为何不起作用。也许我缺少一些基本知识。

我也无法从Google找到任何有前途的线索。

1 个答案:

答案 0 :(得分:-1)

您收到一条错误消息,因为使用者不继承自IConsumer 。它继承自IConsumer

使用这种模板类有一种特殊的技术,您必须创建一个IConsumer接口,它不是通用类型,如下所示:

public interface IA { }
public class AImp : IA { }

public interface IConsumer
{
}

public interface IConsumer<T> : IConsumer
    where T : IA
{
    void Consume(T val);
}

public class Consumer : IConsumer<AImp>
{
    public void Consume(AImp val)
    {
        // do smth
    }
}

public class Program
{
    public static void Main()
    {
        IList<IConsumer> l1 = new List<IConsumer>();
        l1.Add(new Consumer());  // ok
    }
}

这基本上是IEnumerable和ICollection通用和非通用版本背后的想法。