为什么使用泛型类型,然后将其限制为带有“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 编写的。由于协变当时不可用,泛型是下一个最好的东西。


以上是为什么使用泛型类型,然后将其限制为带有“where”的一种类型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>