2012-07-11 44 views
2

我有以下方法:怪異IEnumerable的行爲

public IEnumerable<object> GetParameters(Context context) 
{ 
    yield return new[] { 1, 2, 3 }; 
} 

當我遍歷這個枚舉:

foreach (var parameter in GetParameters()) 
{ 
    // Do something here with parameter 
} 

我期待參數是1在第一循環中,2在第二和3和第三但這不是這種情況:(

enter image description here

parameter是一個包含所有值的數組!

我在這裏錯過了什麼?

回答

3

你的方法更改爲

public IEnumerable GetParameters(Context context) 
{ 
    return new[] { 1, 2, 3 }; 
} 

public IEnumerable GetParameters(Context context) 
{ 
    yield return 1; 
    yield return 2; 
    yield return 3; 
} 
5

您正在返回可枚舉數組的單個實例。

你想:

yield return 1; 
yield return 2; 
yield return 3; 
3

yield return返回一個對象。你似乎在執行類似於yield foreach的東西,它會產生集合中的每個項目。 (這是一個經常被要求的功能,不存在。)

您需要做的僅僅是這樣的:

foreach(int i in new[]{1, 2, 3}) 
    yield return i; 

這也是最好使用強類型IEnumerable如果可能的話,在這種情況下,它會是IEnumerable<int>。如果你這樣做,那麼當你嘗試產生一個集合而不是意外的運行時行爲時,你會得到一個編譯時錯誤。