假设:
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没有意识到Customer
来自Human
:
class Customer : Human {}
答案 0 :(得分:8)
只是你知道为什么你得到了这个错误,ICollection<Customer>
无法传递给ICollection<Human>
,因为它们不是同一个东西。可以这样想,如果你有一个ICollection<Human>
Add(new Deadbeat())
Deadbeat
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
不是协变/逆变因为它使用{ {1}} in
和out
操作{1}}。
答案 1 :(得分:7)
应该只是:
T t = new T();
....
source.Add(t);
此外,您必须添加new
constraint以确保T
具有公共无参数构造函数:
public static void DoStuff<T>(ICollection<T> source) where T: new()
{
//...
}
答案 2 :(得分:1)
你可能想要这样的东西:
public static void DoStuff<T>(ICollection<T> source)
where T : new()
{
T c = new T();
source.Add(c);
}