繁体   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