C# 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 {

我在我的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 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代码。