如何设置类型为List的泛型约束?

2024-02-24

private static void PrintEachItemInList<T>(T anyList) 
Where T:System.Collections.Generic.List<T>
{    
    foreach (var t in T)
    {
        //Do whatever
    }
}

在上面的代码(这是错误的)中,我想做的就是设置一个约束T是一个列表。

目的不是让这个例子起作用,目的是理解如何设置类型是列表的约束?我是仿制药的业余爱好者,正在尝试解决问题:(


也许你想要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 协变在他们的通用参数(类型参数)中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何设置类型为List的泛型约束? 的相关文章

随机推荐