You can only use return type of the delegate if you do not invoke the delegate, but manually call each handler from the invocation list of the delegate invocation list. Here is the example on how to do it:
delegate int NonVoidDelegate(string parameter);
NonVoidDelegate delegateInstance = delegate(string parameter) { return 1; };
delegateInstance += delegate(string parameter) { return 2; };
delegateInstance += delegate(string parameter) { return 3; };
var list = delegateInstance.GetInvocationList();
foreach (var handler in list) {
NonVoidDelegate method = (NonVoidDelegate)handler;
int retValue = method("some parameter");
}
—SA