也许你想要两个类型参数,如:
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<>都是协变的。