所以我有一个对象,让我们说Item<U>
。我想创建一个包含这些项集合的(n)(I)List<T>
。我遇到的问题是Item<U>
的集合可以包含任意数量的U类型。
我无法弄清楚的是用于IList
的签名。我尝试了IList<Item<T>>
,但因为我没有(在IList
要使用的类中)有T
的定义(无论如何我说varys)我不能使用这个签名。达到此要求的最佳方法是什么?
答案 0 :(得分:5)
您需要为Item<U>
添加非通用接口,并从这些接口中进行收集。
您无法创建IList<Item<T>>
的集合,其中T是您要放入同一列表的许多不同对象类型的基本类型。这是co(ntra) - 方差,特别禁止这种情况。
所以你需要添加一些常见的东西,而不是通用的东西,然后列出那个。例如,您可以Item<T>
实施IItem
,然后创建IList<IItem>
。
这是你能做的最好的事情。
答案 1 :(得分:2)
IList意味着拥有一种类型。要确定某些内容是否为“单一类型”,您必须扩展所有类型参数。以IList<Item<T>>
为例,T
必须是特定实例的唯一内容。
例如,您可以为Animal
选择T
,然后继续在Dog
中放置Cat
,Bear
和IList
个实例}。但你不能把任意类型放在那里;它们必须能够转换为您为T
指定的类型。如果您的类型 且以这种方式不相关,除了为您的列表设置非通用接口之外,您没有任何选择。您还可以考虑为所有符合条件的项目定义T的接口类型。
一旦确定T
将是什么,您就可以使您的方法具有通用性:
public void PrintItems<T>(IList<Item<T>> list)
{
// ...
}
答案 2 :(得分:1)
您可以将方法设为通用,例如:
public void DoSomethingWithTheList<T>(IList<Item<T>> theList)
{
//Do that something
}
答案 3 :(得分:1)
.Net 3有点痛苦,因为不同U的所有项目都被视为独立类型。要使其工作,您必须手动引入此类型的接口:
interface IItem{}
class Item<U>:IItem {...}
现在你可以:
IList<IItem> list = new IList<IItem>();
list.Add(new Item<string>());
list.Add(new Item<int>());
或者你可以坚持使用非通用列表。
答案 4 :(得分:0)
你可以试试这个
class Item<U>
{
...
}
class Item : Item<object> {
...
}
....
IList<Item> itemList;
答案 5 :(得分:0)
我想你只想要一个IList<Item<U>>
。关键是泛型T
名称中的IList<T>
只是一个占位符 - 它没有任何特殊含义。你想要一个Item<U>
的列表,所以只需要一个。
现在,这当然意味着包含此IList
的方法/类本身在U
中是通用的,但这似乎取决于您的问题的条款。