static void Main(string[] args) { Func func = Sum; string result = func(2, 4); Console.WriteLine(result); //Print Sum: 6 // I can also call, easier. Why I need here this Func func = Sum; int result = Sum(7,8) } public static string Sum(int a, int b) { string str = string.Format("Sum: {0}", (a + b)); return str; } // The same static void Main(string[] args) { // return value is string, Transfer parameters 1 (int) and 2 (int) Func func = (a, b) => string.Format("Sum: {0}", (a + b)); string result = func(2, 4); Console.WriteLine(result); //Print Sum: 6 } // ############################### // ## I make more samples. private void btnFuncTest_Click(object sender, EventArgs e) { Func func = Sum; string result = func(2, 4); Debug.WriteLine("Simple func Sum= " + result); //Print Sum: 6 Func func1 = delegate (int a, int b) { string str = string.Format("Sum: {0}", (a + b)); return str; }; string result1 = func(2, 4); Debug.WriteLine("delegate func Sum= " + result1); //Print Sum: 6 // -------------------- Func func2 = (a, b) => string.Format("Sum: {0}", (a + b)); string result2 = func2(2, 4); Debug.WriteLine("Lamdba func Sum= " + result2); //Print Sum: 6 string ret2 = GetNameTypeResult("serial", 2, (a, b) => { int sum = a + b + 1000; return sum.ToString(); }); Debug.WriteLine($"ret2= {ret2} with lambda"); string ret2a = GetNameTypeResult("serial 2a test", 2, Sum); Debug.WriteLine($"ret2a= {ret2} with function Sum"); string ret3 = GetNameTypeResult("serialWithout", 2, null); Debug.WriteLine($"ret3= {ret3} with null"); GetNameTypeAdd("var2", 7, Add10); Debug.WriteLine($"only Add void - Action"); } public string GetNameTypeResult(string variableName, int variableType, Func result) { string ret = ""; string newResult = (result != null) ? result(5, 6) : "is null"; ret = $"VariableName= {variableName}, variableType= {variableType} result= {newResult}"; return ret; } public string GetNameTypeAdd(string variableName, int variableType, Action Add10) { string ret = ""; //(Add10 != null) ? Add10(5) : Add10(0); Add10(5); ret = $"VariableName= {variableName}, variableType= {variableType}"; return ret; } public string Sum(int a, int b) { string str = string.Format("Sum: {0}", (a + b)); return str; } void Add10(int x) { int increment = x + 10; Debug.WriteLine("increment = {0}", increment); } }