如何将项目添加到通用集合中
本文关键字:集合 添加 项目 | 更新日期: 2023-09-27 18:19:52
给定:
public static void DoStuff<T>(ICollection<T> source)
{
Customer c = new Customer();
....
source.Add(c);
}
除了CCD_ 1不是类型CCD_。
那么,如何将项目添加到通用集合中呢?
i尝试具有:
public static void DoStuff(ICollection<Human> source)
{
Customer c = new Customer();
....
source.Add(c);
}
但我不使用它,因为没有人可以调用DoStuff
:
ICollection<Customer> c;
DoStuff(c); <---error
因为协方差的某些内容,并且.NET没有意识到Customer
是从Human
:派生而来的
class Customer : Human {}
为了让您了解为什么会出现该错误,ICollection<Customer>
不能传递给ICollection<Human>
,因为它们不是一回事。这样想吧,如果你有一个ICollection<Human>
,你可以Add(new Deadbeat())
,如果c
0是从Human
派生而来的。
关于如何避免你的通用问题的其他答案解决了你的问题(所以他们应该得到答案):
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
用于<T>
0和out
操作。
应该只是:
T t = new T();
....
source.Add(t);
此外,您还必须添加new
约束,以确保T
具有公共的无参数构造函数:
public static void DoStuff<T>(ICollection<T> source) where T: new()
{
//...
}
您可能想要这样的东西:
public static void DoStuff<T>(ICollection<T> source)
where T : new()
{
T c = new T();
source.Add(c);
}