c# - 为什么要使用通用类型然后将其限制为具有 "where"的一种类型?

使用它有什么好处:

DataTable CopyToDataTable<T>(this IEnumerable<T> source) where T : DataRow

在哪里你可以这样做:

DataTable CopyToDataTable<T>(this DataRow[] source)

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

最佳答案

我认为这有两个部分。

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

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

也就是说,由于 covariance可以使用签名:

DataTable CopyToDataTable(this IEnumerable<DataRow> source)

... 用户将能够通过例如一个IEnumerable<TableDetailsRow> (其中 TableDetailsRow 扩展 DataRow )。但是,协方差仅在 C# 4 中引入,并且 that method自 .NET 3.5 以来一直存在,这意味着它可能是用 C# 3 编写的。由于当时协方差不可用,泛型是下一个最好的东西。

关于c# - 为什么要使用通用类型然后将其限制为具有 "where"的一种类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68618503/

相关文章:

google-app-engine - F4_1G 是否属于 google app engine f

rust - 是否可以在不复制数据的情况下将 Vec<&[u8]> 展平为 &[u8] ?

python - Django UUIDField 默认值

python - 如何创建嵌套列表并在每个嵌套中放置特定数量的元素?列表和它的嵌套元素总是不一样的

typescript - 如何在 TypeScript 中有选择地将属性从一个对象复制到另一个对象

javascript - 我如何在 Next.js 中删除 ID 为 ="__next"的 div

c++ - 如何将 C 类型可变参数转换为 C++ 样式可变参数类型?

c++ - 来自具有大小的 char * 缓冲区的双向迭代器

python - 在列表和元组列表之间查找公共(public) id

r - 如何过滤列中包含少于 3 个空格的行? (右)