C# c匿名方法变量范围奇怪的行为和收益率返回,是一个编译器错误还是按预期工作?
我在我的unity 3d程序中使用收益率-回报率作为协同程序 我正在使用Unity3d 4.3和C3.5 如果这是c中的一个bug,我应该在哪里向c团队报告它C# c匿名方法变量范围奇怪的行为和收益率返回,是一个编译器错误还是按预期工作?,c#,C#,我在我的unity 3d程序中使用收益率-回报率作为协同程序 我正在使用Unity3d 4.3和C3.5 如果这是c中的一个bug,我应该在哪里向c团队报告它 public class ClosureTest : TestMonoBehaviour { public void doTest() { var a = Test3(); a.MoveNext(); a.MoveNext(); } class Ctest2 {
public class ClosureTest : TestMonoBehaviour {
public void doTest() {
var a = Test3();
a.MoveNext();
a.MoveNext();
}
class Ctest2 {
public int a;
}
class Ctest1 {
public Ctest2 t2;
}
IEnumerator Test3() {
yield return null;
var c2FuncList = new List<Func<Ctest2>>();
var c1List = new List<Ctest1>();
for (var i = 0; i < 3; i++)
{
var ic1 = new Ctest1();
ic1.t2 = new Ctest2();
ic1.t2.a = i;
c1List.Add(ic1);
}
foreach (var ic1 in c1List)
{
var ic2 = ic1.t2;
c2FuncList.Add(delegate {
return ic2;
});
}
for (var i = 0; i < 3; i++)
{
Equal(c2FuncList[i]().a, i); // always 2.
}
}
}
如果我运行doTest,该类中的Equal将表示需要0,但得到2。有一个解决方法:将匿名方法的内容放入另一个正常函数中,它将按预期工作。.您的代码没有意义,您直接在Test3I中返回null我使用yield-return作为协程,我删除所有协程相关的内容以简化问题。yield return null表示等待Unity 3d中的下一次更新。顺便说一句,若我并没有返回一些内容,编译器可能会生成其他IL代码。