2017-02-28 126 views
3

是否有将List作为参数传递给params参数的方法?假设我有一个像这样的方法:将列表传递给params参数

void Foo(params int[] numbers) 
{ 
    // ... 
} 

这样我可以通过传递任int S或int S按逗号分隔的数组称之为:

int[] numbers = new int[] { 1, 5, 3 }; 
Foo(numbers); 
Foo(1, 5, 3); 

我想知道是否有一种也可以通过List作为参数的方法(不必将其转换为数组)。例如:

List<int> numbersList = new List<int>(numbers); 
// This won't compile: 
Foo(numbersList); 

回答

3

没有

可悲的是,这就是答案。不,那里没有。不是没有将其转换为数组(例如使用.ToArray())。

+0

但是,当我尝试这样做时,我收到“参数参数必须是单维数组”错误。 – serious6

+0

显示您的ToArray代码 - 它应该工作 – pm100

+0

@ serious6我认为您在评论时选择了错误的答案。 – nvoigt

2

您想要更改Foo以接受除params int[]之外的其他内容来执行此操作。

void Foo(IEnumerable<int> numbers) { 
} 

这将允许你在任何一个int[]List<int>

要允许双向传递,你可以这样做:

void Foo(params int[] numbers) { 
    Foo((IEnumerable<int>)numbers); 
} 
void Foo(IEnumerable<int> numbers) { 
    //Do the real thing here 
} 
+0

但它没有编译器支持,将它称为“Foo(1,2,3);”。 – nvoigt

+0

不需要。您必须将其称为Foo(new int [] {1,2,3})。我会做两个重载,如果你需要的 – Tim

+0

我加了一个例子,可以让你调用它的重载 – Tim

0

如果能够改变现有的代码,你总是可以创建一个接受List并将其传递给params方法的重载。

void Foo(params int[] numbers) 
{ 
    // ... 
} 

void Foo(IList<int> numbers) => Foo(numbers.ToArray()); 
+0

使用IList而不是IEnumerable有没有区别/优势? – serious6

+0

@ serious6'IList'是通过'ICollection'从'IEnumerable'派生出来的,所以通过使用'IEnumerable'你给自己更多的灵活性(如果你需要一个列表或者只是使用'IEnumerable'是) – BackDoorNoBaby

+0

你的问题是关于通过一个List,所以我不想承担你想要通过的合同。使用IEnumerable确实会更灵活。如果你传入参数,我不认为IEnumerable和int []之间会有编译器模糊。我将致力于使用最少量方法调用的解决方案。如果大部分调用都来自列表,那么我会将List/IEnumerable方法作为主要方法并使params通过。否则,请保持原样。 – Jecoms