c#匿名方法变量范围奇怪的行为与yield return,是编译器错误还是按计划工作?

时间:2014-03-01 07:16:16

标签: c#

我在我的统一3d程序中使用yield return东西作为协程。

我使用Unity3d 4.3和c#3.5。

如果这是c#中的错误,我应该在哪里向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。

0 个答案:

没有答案