如何将项目添加到通用集合中

本文关键字:集合 添加 项目 | 更新日期: 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()),如果c0是从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);
}