为什么使用泛型类型,然后将其限制为带有“where”的一种类型?
c#
使用这个有什么好处:
DataTable CopyToDataTable<T>(this IEnumerable<T> source) where T : DataRow
你可以这样做:
DataTable CopyToDataTable<T>(this DataRow[] source)
对不起,如果这是一个愚蠢的问题,我是新手
回答
我认为这有两个部分。
首先是接受一个IEnumerable比接受一个数组更灵活。如果用户有一个List<DataRow>,或其他一些集合类型怎么办?如果他们想传递 linq 查询的结果怎么办?接受一个数组会迫使他们分配一个新数组来传递给CopyToDataTable,这是不必要的成本。
没有理由CopyToDataTable需要一个数组:它只需要一个IEnumerable. 所以最好是只接受一个IEnumerable.
也就是说,由于协方差,可以使用签名:
DataTable CopyToDataTable(this IEnumerable<DataRow> source)
...并且用户将能够传递例如 an IEnumerable<TableDetailsRow>(where TableDetailsRowextends DataRow)。然而,协变只在 C# 4 中引入,并且该方法从 .NET 3.5 开始就已经存在,这意味着它可能是用 C# 3 编写的。由于协变当时不可用,泛型是下一个最好的东西。