为什么使用泛型类型,然后将其限制为带有“where”的一种类型?

Abd*_*yev 1 .net c#

使用这个有什么好处:

DataTable CopyToDataTable<T>(this IEnumerable<T> source) where T : DataRow
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

DataTable CopyToDataTable<T>(this DataRow[] source)
Run Code Online (Sandbox Code Playgroud)

对不起,如果这是一个愚蠢的问题,我是新手

can*_*on7 7

我认为这有两个部分。

首先是接受一个IEnumerable比接受一个数组更灵活。如果用户有一个List<DataRow>,或其他一些集合类型怎么办?如果他们想传递 linq 查询的结果怎么办?接受一个数组会迫使他们分配一个新数组来传递给CopyToDataTable,这是不必要的成本。

没有理由CopyToDataTable需要一个数组:它只需要一个IEnumerable. 所以最好是只接受一个IEnumerable.

也就是说,由于协方差,可以使用签名:

DataTable CopyToDataTable(this IEnumerable<DataRow> source)
Run Code Online (Sandbox Code Playgroud)

...并且用户将能够传递例如 an IEnumerable<TableDetailsRow>(where TableDetailsRowextends DataRow)。然而,协变只在 C# 4 中引入,并且该方法从 .NET 3.5 开始就已经存在,这意味着它可能是用 C# 3 编写的。由于协变当时不可用,泛型是下一个最好的东西。