为什么不能在params中使用IEnumerable?这将来会被修复吗?我真的希望他们可以重写旧的库以使用泛型...
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作为参数类型,然后就可以完成了。
这个问题会被解决吗?
我希望如此。这个功能已经在列表中很长时间了。它会使许多函数与LINQ更好地协作。
Frob(from c in customers select c.Age);
无需编写两个不同版本的Frob。
然而,这只是一个“小便利”功能;它实际上并没有为语言增加很多新的功能。这就是为什么它从未高到足以进入“规范编写”阶段的优先级列表。
我真希望他们能重写旧的库来使用泛型。
注意到评论了。
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)
{
}
List<string> x = new List<string>();
Foo<string>(x);
Foo<string>
那么它在两种情况下都能工作。我会编辑我的答案以澄清这一点。 - Jon Skeet参数params以数组形式发送,而IEnumerable<T>
不提供所需的随机访问以充当数组。
在调用方法时,您必须从IEnumerable创建数组:
TheMethod(theIEnumerable.ToArray());
params
时,IEnumerable<T>
接口并不存在。为什么之后没有被添加可能是因为它不是很有用的功能。您可以添加重载以支持params T[]
和IEnumerable<T>
两者。 - Guffa.ToArray()
——这很愚蠢。 - BrainSlugs83
params array
仍然是通用的,将其变为IEnumerable
不会增加它的通用性。也许你的意思是使其更加 普适。 - nawfal