С делегатами можно сообщать методы имеющие возвращаемое значение (при чём их количество неограниченно). Из этого следует, что я могу, например, сообщить с делегатом несколько методов возвращаемое значение которых тип string. Что будет результатом вызова (Invoke) всех методов сообщённых с делегатом? Произойдёт ли конкатенация всех возвращаемых значений? Если не происходит конкатенация всех возвращаемых значений методов сообщённых с делегатом, то как её организовать?
вернётся возвращаемое значение последнего сообщённого метода
Конкатенации возвращаемых значений не будет и на прямую организовать при вызове 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 сообщать несколько методов, поскольку это потеряет весь смысл.
Кроме предложенного 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();
}