С# Что вернёт вызов методов в делегате?


#1

С делегатами можно сообщать методы имеющие возвращаемое значение (при чём их количество неограниченно). Из этого следует, что я могу, например, сообщить с делегатом несколько методов возвращаемое значение которых тип string. Что будет результатом вызова (Invoke) всех методов сообщённых с делегатом? Произойдёт ли конкатенация всех возвращаемых значений? Если не происходит конкатенация всех возвращаемых значений методов сообщённых с делегатом, то как её организовать?


#2

вернётся возвращаемое значение последнего сообщённого метода

Конкатенации возвращаемых значений не будет и на прямую организовать при вызове Invoke на делегате получения в качестве результата конкатенацию всех возвращаемых значений у Вас не выйдет. Если сильно нужно, то можете сделать, что то похожее на это:

delegate string ResultDelegate(List<MyDelegate> delegates);
delegate string MyDelegate();

static void Main()
{
    List<MyDelegate> myDelegets = new List<MyDelegate> ()
    {
        () => "Hello ",
        () => "world!"
    };

    ResultDelegate functional = (delegates) =>
    {
        string str = ""; 
        for (int i = 0; i < delegates.Count; i++)
        {
            if (delegates[i] != null)
            {
                str += delegates[i].Invoke();
            }
        }
        return str;
    };

    Console.WriteLine(functional(myDelegets));
    
    Console.ReadKey();
}

Но в таком случае Вам нельзя с одним экземпляром myDelegets сообщать несколько методов, поскольку это потеряет весь смысл.


#3

Кроме предложенного Anton-ом способа, также есть немного другой. Вы можете записать в делегат все методы, после чего на данном экземпляре вызвать метод GetInvocationList и получить массив Delegates, после чего сделать следующее:

static void Main(string[] args)
{
    Func<string> action = () => "Hello ";
    action += () => "world!!!";
    string str = "";

    foreach (Func<string> item in action.GetInvocationList())
    {
        str += item.Invoke();
    }

    Console.WriteLine(str);

    Console.ReadKey();
}

image