c# - 参数 IEnumerable<T> c#

标签 c# generics ienumerable parameters

为什么我不能使用带参数的 IEnumerable?这会被修复吗?我真的希望他们重写旧库以使用泛型...

最佳答案

Why cant I use an IEnumerable with params?

问题的前提是设计团队必须提供向语言添加功能的理由。这个假设是错误的。

相反,为了让您使用某个功能,需要对其进行思考、设计、指定、实现、测试、记录和发布。所有这些都有很大的成本。

已经想到并设计了“params enumerable”特性。它从未被指定、实现、测试、记录或运送。

因此,您不能使用该功能。


更新:截至撰写本文时 - 2015 年初 - 现已指定,但在 2014 年下半年削减了 C# 6.0 的实现、测试、文档和运输。请在此处查看 Lucian 的公告:http://roslyn.codeplex.com/discussions/568820 .

由于尚未实现、测试、记录和发布,因此仍然没有这样的功能。希望这将使它成为一个假设的 future C# 版本。


更新:我应该澄清我所说的“功能”是什么意思,因为我们可能对“功能”是什么有不同的想法。我说的功能是让你说出类似的话

void Frob(params IEnumerable<int> x)
{
    foreach(int y in x) ...
}

然后调用点可以是传递整数序列的“正常形式”,也可以是 Frob(10, 20, 30) 的“扩展形式”。如果在扩展形式中,编译器会生成调用,就好像您说的是 Frob(new int[] { 10, 20, 30}),就像它对参数数组所做的一样。该功能的要点是,通常情况下该方法从不使用对数组的随机访问,因此,我们可以弱化参数是数组的要求。参数可以只是一个序列。

你今天可以通过重载来做到这一点:

void Frob(params int[] x) { Frob((IEnumerable<int>)x); }

void Frob(IEnumerable<int> x)
{
    foreach(int y in x) ...
}

这有点痛苦。我们可以简单地允许您使用 IEnumerable 作为 params 参数的类型并完成它。

Will this ever be fixed?

希望如此。此功能已列在列表中很长时间。它将使许多函数与 LINQ 一起工作得更好。

Frob(from c in customers select c.Age);

无需编写两个不同版本的 Frob。

然而,这仅仅是一个“小便利”功能;它实际上并没有给语言增加很多新的功能。这就是为什么它从未在优先级列表中排在足够高的位置以进入“规范已编写”阶段的原因。

I really wish they would rewrite the old libraries to use generics.

注释已记录。

关于c# - 参数 IEnumerable<T> c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2128759/

相关文章:

c# - 使用 Windows Phone 7 检测网络上的机器

java - 无法使用通配符泛型类型向 Java 集合添加值

reactjs - Typescript 编译器不强制执行泛型

java - 返回多个泛型类时未经检查的转换

c# - 在没有 .ToList() 复制操作的情况下将 List<Concrete> 转换为 List<Inherited Interface>

c# - 组合 monad(以 IEnumerable 和 Maybe 为例)

c# - 在统一脚本中,如何围绕枢轴位置 "rotate"和 "rotate to"

c# - 协程的替代设计模式

c# - 这段代码中真的有 IEnumerable 的多次迭代吗?

c# - 此代码的哪一行可能引发 "Index was outside the bounds of the array"异常?