c# – 如何将项目添加到通用集合?
作者:互联网
鉴于:
public static void DoStuff<T>(ICollection<T> source)
{
Customer c = new Customer();
....
source.Add(c);
}
除了c不是< T>类型.
那么如何将项目添加到通用集合中?
我试过:
public static void DoStuff(ICollection<Human> source)
{
Customer c = new Customer();
....
source.Add(c);
}
但我不使用它,因为没有人可以调用DoStuff:
ICollection<Customer> c;
DoStuff(c); <---error
因为有关协方差的东西,并且.NET没有意识到客户来自人类:
class Customer : Human {}
解决方法:
只是让你知道为什么会出现这个错误,ICollection< Customer>无法传递给ICollection< Human>因为他们不是一回事.想一想,如果你有一个ICollection< Human>如果Deadbeat派生自Human,你可以添加(新Deadbeat()).
关于避免使用泛型问题的方法的其他答案可以解决您的问题(因此他们应该得到答案):
public static void DoStuff<T>(ICollection<T> source) where T : new()
{
T c = new T();
...
source.Add(c);
}
但我只是想抛出这个答案来解释你为什么会得到这个错误.想想看,如果您可以将Customer的集合作为Human的集合传递,它会让您添加任何类型的人,这会违反原始集合.
因此,即使Customer扩展了Human,这并不意味着ICollection< Customer>扩展ICollection< Human>和ICollection< T>不是协变/逆变,因为它在进出操作中都使用T.
标签:c,collections,generic-collections 来源: https://codeday.me/bug/20190713/1447433.html