我一直在试图理解以下内容为什么会生成编译错误,以及如何解决该错误。
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找到任何有前途的线索。
答案 0 :(得分:-1)
您收到一条错误消息,因为使用者不继承自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通用和非通用版本背后的想法。