Uninomicon

Documenting the dark corners of the Unity Engine.

User Tools

Site Tools


ienumerator

This is an old revision of the document!


IEnumerator

Notes on the underlying implementation of C# generators (which are used in Unity for coroutines).

Lambda function DisplayClass classes are initialized at the start of the function

The following code, in SharpLab decompiles it as:

using System;
using System.Collections;
public class C {
    public IEnumerator M() {
        int x = 5;
        yield return Test(() => x > 5);
        yield return 5;
        yield return 5;
        yield return 5;
    }
 
    public IEnumerator Test(Func<bool> func) {
        yield return func();
    }
}
.. snipped
private bool MoveNext()
        {
            switch (<>1__state)
            {
                default:
                    return false;
                case 0:
                    <>1__state = -1;
                    <>8__1 = new <>c__DisplayClass0_0();
                    <>8__1.x = 5;
                    <>2__current = 5;
                    <>1__state = 1;
                    return true;
                case 1:
                    <>1__state = -1;
                    <>2__current = 5;
                    <>1__state = 2;
                    return true;
                case 2:
                    <>1__state = -1;
                    <>2__current = <>4__this.Test(new Func<bool>(<>8__1.<M>b__0));
                    <>1__state = 3;
                    return true;
                case 3:
                    <>1__state = -1;
                    <>2__current = 5;
                    <>1__state = 4;
                    return true;
                case 4:
                    <>1__state = -1;
                    return false;
            }
        }

The lambda function is stored as a local variable <>8__1 in the generated IEnumerator class. However, the instance is created at the start of the function, not just before usage, as one might expect.

ienumerator.1616030016.txt.gz · Last modified: 2021/03/18 01:13 by 73.95.178.156