'foreach循环中使用未分配的局部变量'错误,产量返回

时间:2014-04-16 13:25:00

标签: c# yield-return

下面的方法编译得很好。

string DoSomething(int x) {
    string s;
    if(x < 0)
        s = "-";
    else if(x > 0)
        s = "+";
    else
        return "0";

    return DoAnotherThing(s);
}

但是当我在foreach循环中编写相同的代码并使用yield return而不是return时,我得到Use of unassigned local variable 's'编译错误。

// Causes compile error
IEnumerable<string> DoSomethingWithList(IEnumerable<int> xList) {
    foreach(var x in xList) {
        string s;

        if(x < 0)
            s = "-";
        else if(x > 0)
            s = "+";
        else
            yield return "0";

        // COMPILE ERROR: Use of unassigned local variable 's'
        yield return DoAnotherThing(s);
    }
}

对我来说,当代码到达该行时,就会明显s。可能是导致此错误的原因,可能是编译器错误?

2 个答案:

答案 0 :(得分:7)

这不是编译器错误。 (周围的人很少,真的,所以打一个的机会很小。)这是你代码中一个非常简单的错误。

x的值为零时,您的代码会进入else块并产生"0"。当请求下一个值时,该方法继续并执行以下行:

yield return DoAnotherThing(s);

...此时您尚未为s分配任何值。

答案 1 :(得分:3)

如果x等于零,则永远不会分配s。因此,您将未分配的变量传递给DoAnotherThing()

你可能希望在else子句中使用yield break。请记住,yield return的返回方式与普通函数不同。它返回一个项目,但允许您继续迭代。 yield break停止迭代。