为什么我不能使用带参数的 IEnumerable?
这个问题的前提是设计团队必须提供一个不向语言添加功能的理由。这个假设是错误的。
相反,您需要考虑、设计、指定、实施、测试、记录和交付某个功能。所有这些都有很大的成本。
“params 可枚举”功能已被考虑和设计。它从未被指定、实施、测试、记录或发布。
因此,您无法使用该功能。
更新:在撰写本文时 - 2015 年初 - 现已指定,但在 2014 年下半年 C# 6.0 的实现、测试、文档和发布都被削减了。请参阅 Lucian 的公告:http://roslyn.codeplex.com/discussions/568820。
由于尚未实施、测试、记录和发布,因此仍然没有此类功能。希望这将使它成为 C# 的假设未来版本。
更新:我应该澄清我所说的“功能”是什么意思,因为我们的头脑中可能都有不同的想法,什么是“功能”。我说的功能是允许你说类似的东西
void Frob(params IEnumerable<int> x)
{
foreach(int y in x) ...
}
然后调用站点可以是传递整数序列的“正常形式”,也可以是 Frob(10,20,30) 的“扩展形式”。如果采用扩展形式,编译器会生成调用,就好像您说的是 Frob(new int[] { 10, 20, 30}),这与对 param 数组所做的一样。该功能的要点是,该方法通常从不使用对数组的随机访问,因此,我们可以削弱参数是数组的要求。参数可以只是一个序列。
你今天可以通过重载来做到这一点:
void Frob(params int[] x) { Frob((IEnumerable<int>)x); }
void Frob(IEnumerable<int> x)
{
foreach(int y in x) ...
}
这有点痛苦。我们可以简单地允许您使用 IEnumerable 作为 params 参数的类型并完成它。
这个问题会得到解决吗?
我希望如此。这个功能已经上榜很久了。它将使许多函数与 LINQ 一起工作得更好。
Frob(from c in customers select c.Age);
无需编写两个不同版本的 Frob。
不过,它只是一个“小便利”的功能;它实际上并没有为语言增加很多新的力量。这就是为什么它从来没有在优先级列表中达到足够高的位置以使其进入“编写规范”阶段。
我真的希望他们重写旧库以使用泛型。
注释已注明。