2017-02-28 128 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