编程语言
首页 > 编程语言> > c# – 如何将项目添加到通用集合?

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

作者:互联网

鉴于:

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没有意识到客户来自人类:

class Customer : Human {}

解决方法:

只是让你知道为什么会出现这个错误,ICollection< Customer>无法传递给ICollection< Human>因为他们不是一回事.想一想,如果你有一个ICollection< Human>如果Deadbeat派生自Human,你可以添加(新Deadbeat()).

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

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.

标签:c,collections,generic-collections
来源: https://codeday.me/bug/20190713/1447433.html