【发布时间】:2018-08-08 10:30:44
【问题描述】:
我正在阅读 C# 深度(第 3 版)和第 13 章,在讨论在 c# 4 中包含协变和逆变类型参数的部分中,提出了以下声明:
List.AddRange 的参数是 IEnumerable
类型的,因此在这种情况下,您将每个列表都视为一个 IEnumerable ——这在以前是不可能的。 AddRange 可以编写为具有自己类型参数的泛型方法,但事实并非如此——这样做会使一些优化变得困难或不可能。
谁能为这种说法提供一些理由?不清楚为什么它对我来说是正确的。
【问题讨论】:
-
把这个 sn-p 断章取意会让人很难理解它在说什么。特别是因为
AddRange有一个通用参数。但它说的是,让AddRange接受一个不同的 类型,例如可以转换为T 的Y,会使优化变得困难。 -
@Mahmoud 允许实现或继承自 T 的类型
-
我也不明白你的问题。由于
List<T>已经是 泛型,T作为泛型参数,AddRange也具有完全相同的参数。因此不能将另一种类型的实例添加到列表中。那么你的问题是什么? -
无论如何:为什么这个问题的投票率如此之高,尽管似乎没有人理解它?
-
我的猜测是 Jon 暗示了类似
void AddRange<TDerived>(IEnumerable<TDerived> collection) where TDerived : T的签名,但这意味着您需要迭代新项目而不是可能使用Array.Copy作为 it does now?跨度>
标签: c# .net performance generics covariance