下面的方法编译得很好。
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
。可能是导致此错误的原因,可能是编译器错误?
答案 0 :(得分:7)
这不是编译器错误。 (周围的人很少,真的,所以打一个的机会很小。)这是你代码中一个非常简单的错误。
当x
的值为零时,您的代码会进入else
块并产生"0"
。当请求下一个值时,该方法继续并执行以下行:
yield return DoAnotherThing(s);
...此时您尚未为s
分配任何值。
答案 1 :(得分:3)
如果x
等于零,则永远不会分配s
。因此,您将未分配的变量传递给DoAnotherThing()
。
你可能希望在else子句中使用yield break
。请记住,yield return
的返回方式与普通函数不同。它返回一个项目,但允许您继续迭代。 yield break
停止迭代。