delegate void MethodSpeicher(string x);
 
 public static void Main(string[] args)
        {
        MethodSpeicher bsp = A.Methode1;   // 1. nicht anonyme Methodenzuweisung
        bsp += delegate(string t) { Console.WriteLine($"{t} ich bin eine anonyme Methode"); }; //Anonyme Methode
        bsp += x => Console.WriteLine($"{x}ich bin ein Lamda ausdruck "); // Lambda Ausdruck
        bsp += A.Methode2; // nicht anonyme Methodenzuweisung 
        bsp(" hallo  "); // hier übergebe ich den im delegate gespeicherten Methoden den string parameter
        }
        
     class A // klasse mit Methode die einen string verdoppelt
    {
        public static void Methode1(string x)
        {
            Console.WriteLine($"{x} bin TEst methode");
        }

        public static void Methode2(string y)
        {
            Console.WriteLine($" {y} beta  ");
        }
    }
    <Ausgabe: es werden alle Methoden ausgegeben ABER achtung: bei Methoden die etwas returnen wird nur der wert der zuletzt aufgerufenen Methode returnt"> >
    hallo   bin TEst methode
    hallo   ich bin eine anonyme Methode
    hallo  ich bin ein Lamda ausdruck 
    hallo   beta  
    
    Generisches Delegate: 
    delegate T MyDel<T> (T x, T y); 
    <instanzieren>: MyDel<int> w = (x,y) => x+y;