[英]How do i add items to a generic collection?
鑒於:
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 {}
只是因為你知道為什么會出現這個錯誤, 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
兩個in
和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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.