Params IEnumerable <T> c#
为什么不能用params使用IEnumerable? 这会永久解决吗? 我真的希望他们会重写旧的图书馆使用generics…
为什么不能用params使用IEnumerable?
这个问题的前提是devise团队必须提供一个不添加特征的理由。 这个假设是错误的。
相反,为了使您的function被使用,需要考虑,devise,指定,实施,testing,logging和发运。 所有这些都有很大的成本。
“params enumerable”特征已经被考虑和devise。 它从未被指定,实施,testing,logging或运输。
因此,您不能使用该function。
更新:截至撰写本文 – 2015年初 – 已经被指定,但2014年下半年C#6.0的实现,testing,文档和运输被削减。请参阅Lucian在这里的公告: http://roslyn.codeplex。 com / discussion / 568820 。
由于还没有实施,testing,logging和发货,所以仍然没有这样的function。 希望这会使它成为一个假想的未来版本的C#。
更新:我应该澄清我的意思是“function”,因为我们大家可能在头脑中有不同的想法是什么“function”。 我所说的function是让你说出类似的话
void Frob(params IEnumerable<int> x) { foreach(int y in x) ... }
然后呼叫站点可以是传递整数序列的“正常forms”,也可以是Frob(10,20,30)的“扩展forms”。 如果在扩展forms中,编译器会像您所说的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参数的types,并用它来完成。
这会永久解决吗?
但愿如此。 这个function已经在很长一段时间了。 这将使得LINQ很多function更好地工作。
Frob(from c in customers select c.Age);
而不必编写两个不同版本的Frob。
但是,这只是“小便利”function, 它实际上并没有为语言增加许多新的力量。 这就是为什么它在优先级列表中从来没有达到足够高的地步,使其达到“规范写入”阶段。
我真的希望他们会重写旧的库来使用generics。
评论指出。
啊,我想我现在可能明白你的意思了。 我想你想能够像这样声明一个方法:
public void Foo<T>(params IEnumerable<T> items) { }
然后能够用这样的“正常”参数来调用它:
IEnumerable<string> existingEnumerable = ...; Foo(existingEnumerable);
或者像这样的多个参数:
Foo("first", "second", "third");
那是你以后的事? (注意你希望第一个表单使用T=string
,而不是T=IEnumerable<string>
和单个元素…)
如果是这样,我同意这可能是有用的 – 但它很容易有:
public void Foo<T>(params T[] items) { Foo((IEnumerable<T>) items); } public void Foo<T>(IEnumerable<T> items) { }
我不觉得我经常这样做,使上述一个特别丑陋的解决方法。
请注意,在调用上述代码时,您需要显式指定types参数,以避免编译器偏好params
示例。 举个例子:
List<string> x = new List<string>(); Foo<string>(x);
params参数作为数组发送,而IEnumerable<T>
不提供作为数组所需的随机访问。
当您调用方法时,您必须从IEnumerable创build数组:
TheMethod(theIEnumerable.ToArray());