[C#] Делегаты

Прежде чем начать разбираться, обратимся к официальному определению.

Делегат — это тип, который представляет ссылки на методы с определенным списком параметров и типом возвращаемого значения. При создании экземпляра делегата этот экземпляр можно связать с любым методом с совместимой сигнатурой и типом возвращаемого значения. Метод можно вызвать (активировать) с помощью экземпляра делегата.

Объявление делегата

public delegate int PerformCalculation(int x, int y);
public delegate void PerformCalculation();

Какие значения принимают делегаты?

Делегаты могут принимать любые методы из любого доступного класса. Метод должен быть статичным или быть методом экземпляра. Использование делегатов позволяет изменять программно методы и включать новый код в существующие классы.

Методы передаваемые в делегат должны иметь идентичные типы входящих параметров и возвращаемых значений. Это значит, что в делегат, возвращающий тип INT, мы не можем передать метод, возвращающий FLOAT.

ПРИМЕР:

 using System;
class Calc
{
    public int Add(int a, int b)
    {
        int result = a + b;
        return result;
    }
 
    public int AddThree(int a, int b, int c)
    {
        int result = a + b + c;
        return result;
    }
 
    public float Division(int a, int b)
    {
        float result = a / b;
        return result; 
    }
}  
 
class Program  
{ 
  public delegate int Operation(int x, int y);
 
	static void Main()  
    { 
	Calc calc  = new Calc();
	Operation operation;
        operation  = calc.Add;//ПРАВИЛЬНО
 
        operation  = calc.AddThree; //ОШИБКА! Больше параметров
        // чем в делегате
        operation  = calc.Division;//ОШИБКА! Возвращаемый тип не 
        // соответствует типу делегата
	Console.WriteLine("result=" + operation(3,4).ToString());
 
    }  
 
}

Официальная документация C#