..

Lambda funkce

Taky anonymni metody, jmeno totiz vygeneruje C# prekladac.

Staticke lambda funkce

Klicove slovo static rika, ze lambda funkce nema stav.

static (params) => { body }

static (int x) => { return x * x; }  // statement body
static (int x) => x * x   // expression body
static x => x * x         // implicitly typed, prekladac cela type inference

static (int x, int y) => x + y
static (x, y) => x + y

static () => Console.WriteLine()

Lambda vyrazy nejsou “first class entities”, neexistuje typ “lambda funkce”. Ale mohou byt implicitne prevedena na typ delegate. Type inference parametru se dela podle delegata, kam to prirazuju.

Func<int, int> f1 = static x => x + 1;   // bere int vraci int
Func<int, double> f2 = static x => x + 1;  // bere int vraci double
Func<double, int> f3 = static x => x + 1;  // error, neexistuje implicitni konverze z double na int

Pro type inference prikladac resi nejakou rovnici, pokud je to nejaka slozita situace bez jednoznacneho reseni, tak je to prekladova chyba.

Lambda funkce s vnitrnim stavem

List<Action> actions = new List<Action>();

for (int x = 0; x < 2; x++) {
    int i = 0;
    for (int y = 0; y < 3; y++) {
        int j = 0;
        actions.Add(() => Console.WriteLine(
            "lambda: j:{0}, i:{1}, y:{2}, x:{3}",
            ++j, ++i, ++y, ++x
        ));
    }
}

foreach (Action a in actions) a();
lambda: j:1, i:1, y:4, x:3
lambda: j:1, i:2, y:5, x:4
lambda: j:1, i:3, y:6, x:5
lambda: j:1, i:1, y:4, x:6
lambda: j:1, i:2, y:5, x:7
lambda: j:1, i:3, y:6, x:8