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

时间:2012-01-10 19:51:20

标签: c# collections generic-collections

假设:

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 {}

3 个答案:

答案 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}} inout操作{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);
}