foreach循环中奇怪的IEnumerable行为

时间:2012-07-11 15:44:02

标签: c# foreach iterator ienumerable yield-return

我有以下方法:

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处为parameter,但事实并非如此:(

enter image description here

{{1}}是一个包含所有值的数组!

我在这里缺少什么?

3 个答案:

答案 0 :(得分:5)

您将返回可枚举数组的单个实例。

你想:

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

答案 1 :(得分: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;
}

答案 2 :(得分:3)

yield return返回单个对象。你似乎正在尝试像yield foreach那样产生集合中每个项目的东西。 (这是一个经常被请求的功能,不存在。)

您只需要执行以下操作:

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

最好尽可能使用强类型IEnumerable,在这种情况下它应为IEnumerable<int>。如果您这样做,那么当您尝试生成集合而不是意外的运行时行为时,您将收到编译时错误。