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());