go to english version »
V nové verzi C# 3.0 můžeme najít nové vlastnosti, které známe spíše z funkcionálních jazyků (například lambda expressions). Když jsem ale zpočátku zkoušel různé základní funkcionální postupy, byl jsem celkem zklamaný - nemohl jsem nadeklarovat rekurzivní funkci.
Jaký byl tedy problém? Podívejme se na implementaci jednoduché funkce factorial (int -> int) - má jeden parameter int a vrací int:
Test 1
Func<int, int> fac = x => x == 0 ? 1 : x + fac(x - 1)
Toto je optimální jednořádkové řešení, které ale bohužel v C# nefunguje, dostaneme chybu “Use of unassigned local variable ‘fac’“. Nemůžeme takto psát rekurzivní funkce, protože compiler nezná naši fac funkci při rekurzivním volání.
Test 2
Zkusíme tedy nadeklarovat fac funkci o jeden řádek dřív:
Func<int, int> fac;
fac = x => x == 0 ? 1 : x + fac(x - 1);
Stejná chyba, “Use of unassigned local variable ‘fac’”
Test 3
Func<int, int> fac = null;
fac = x => x == 0 ? 1 : x + fac(x - 1);
Toto řešení již funguje, pokud tedy chceme volat funkci rekurzivně, musíme ji nadeklarovat a přiřadit hodnotu null dřív, před implementací samotné funkce. Nicméně jak můžeme vidět, C# 3.0 nám nedovolí deklarovat ’sexy’ jednořádkové funkce.