也许你想要两个类型参数,如:
private static void PrintEachItemInList<TList, TItem>(TList anyType)
where TList : System.Collections.Generic.List<TItem>
如果您使用实际派生自List<>
. 如果您想要任何充当列表的东西,请考虑改为限制到界面 IList<>
。然后它将适用于List<>
、一维数组和实现接口的自定义类(但不一定派生自List<>
)。
编辑:正如评论所指出的,这种方法使用起来很麻烦,因为编译器不会推断这两个类型参数,所以在调用方法时必须明确给出它们。
考虑只使用:
private static void PrintEachItemInList<TItem>(List<TItem> anyType)
因为从 a 派生的任何东西都List<>
可以分配给List<>
,所以可以使用派生类作为参数调用该方法,并且在许多情况下TItem
,编译器可以自动推断类型。
还是考虑用接口IList<>
。
如果您想要做的只是从列表中读取,请使用IReadOnlyList<TItem>
而不是IList<TItem>
. 这向来电者发出信号,表明您不会更改他的列表。调用时仍然不需要强制转换语法,例如:PrintEachItemInList(new[] { 2, 3, 5, 7, });
. 该类型IReadOnlyList<>
是 .NET 4.5 版中的新类型。
如果您只想从列表中读取,并且您不想使用索引器(否anyType[idx]
),并且您不想使用.Count
属性,实际上您只想foreach
通过列表, 使用IEnumerable<TItem>
. 再次,您表示您不会更改人员列表。
两者IReadOnlyList<>
和在它们的通用参数(类型参数)中IEnumerable<>
都是协变的。