也许你想要two类型参数,如:
private static void PrintEachItemInList<TList, TItem>(TList anyType)
where TList : System.Collections.Generic.List<TItem>
如果您使用实际派生自的类,这很有用List<>
。如果你想要任何东西acts作为一个列表,考虑限制界面 IList<>
反而。然后它将为List<>
、一维数组和实现接口的自定义类(但不一定派生自List<>
).
Edit:正如注释所指出的,该方法使用起来很麻烦,因为编译器不会推断这两个类型参数,因此在调用该方法时必须显式给出它们。
考虑只使用:
private static void PrintEachItemInList<TItem>(List<TItem> anyType)
因为任何源自List<>
可分配给List<>
,可以使用派生类作为参数来调用该方法,并且在许多情况下,类型TItem
可以由编译器自动推断。
还是考虑使用接口IList<>
.
如果你想做的就是read从列表中,使用IReadOnlyList<TItem>
代替IList<TItem>
。这向呼叫者发出信号,表明您不会更改他的列表。调用时仍然不需要强制转换语法,例如:PrintEachItemInList(new[] { 2, 3, 5, 7, });
。方式IReadOnlyList<>
是 .NET 4.5 版中的新增内容。
如果您只想从列表中读取数据,并且不想使用索引器(不anyType[idx]
),并且您不想使用.Count
财产,事实上,你想做的就是foreach
通过列表,使用IEnumerable<TItem>
。你再次表明你不会改变人们的名单。
Both IReadOnlyList<>
and IEnumerable<>
are 协变在他们的通用参数(类型参数)中。