簡體   English   中英

如何將項目添加到通用集合?

[英]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兩個inout操作。

應該只是:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM