public delegate string MyDelegate(int arg1, int arg2);
public delegate void MyDelegateWithReference(int arg1, ref int arg2);
public class ClassMethodAsDelegate
public static string func2(int a, int b){
Console.WriteLine("Class Delegate");
return (a * b).ToString();
static string func1(int a, int b){
return (a + b).ToString();
static void refFunc1(int a, ref int b){
Console.WriteLine("RefFunc1: "+(a + b).ToString());
static void refFunc2(int a, ref int b){
Console.WriteLine("RefFunc2: "+(a + b).ToString());
public static void Main()
Console.WriteLine("Delegate is: "+ f(10,20));
f = ClassMethodAsDelegate.func2;
Console.WriteLine("Changed Delegate function is: "+ f(10,20));
MyDelegate AnonFunc = delegate (int a, int b){
Console.WriteLine("Anonimus Delegate");
Console.WriteLine("Anonimus Delegate function is: "+ AnonFunc(10,20));
MyDelegate chainedDelegates = f;
chainedDelegates += AnonFunc;
Console.WriteLine("Chained Delegates: "+ chainedDelegates(10,20));
MyDelegateWithReference fr = refFunc1;
Console.WriteLine("Chained Delegates, using reference parameters: ");