3

鉴于:

public static void DoStuff<T>(ICollection<T> source)
{
    Customer c = new Customer();
    ....
    source.Add(c);
}

exceptc不是类型<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 {}
4

3 回答 3

8

只是为了让您知道为什么会出现该错误, anICollection<Customer>不能传递给 anICollection<Human>因为它们不是同一件事。这样想,如果你有一个你ICollection<Human>可以从.Add(new Deadbeat())DeadbeatHuman

关于避免泛型问题的其他答案可以解决您的问题(因此他们应该得到答案):

public static void DoStuff<T>(ICollection<T> source) where T : new()
{
    T c = new T();
    ...
    source.Add(c);
}

但我只是想抛出这个答案来解释为什么你会得到这个错误。想一想,如果你可以将一个集合Customer作为一个集合传递Human,它会让你添加任何类型的人,这将违反原始集合。

因此,即使Customerextends Human,这并不意味着ICollection<Customer>extendsICollection<Human>并且ICollection<T>不是协变/逆变的,因为它T同时用于inandout操作。

于 2012-01-10T19:56:13.020 回答
7

应该只是:

T t = new T();
....
source.Add(t);

此外,您必须添加new约束以保证T具有公共无参数构造函数:

public static void DoStuff<T>(ICollection<T> source) where T: new()
{
   //...
}
于 2012-01-10T19:53:38.310 回答
1

你可能想要这样的东西:

public static void DoStuff<T>(ICollection<T> source)
    where T : new()
{
    T c = new T();
    source.Add(c);
}
于 2012-01-10T19:55:10.530 回答