为什么我不能使用带参数的 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/