Чтобы ответить на ваш первый вопрос, попробуйте изменить свой первый образец следующим образом:
return (byte[])this.Invoke((MethodInvoker)delegate
{
return GetBytes();
});
В этот момент у вас будет та же ошибка компиляции.
public object Invoke(Delegate method)
возвращает объект, поэтому вы можете привести возвращаемое значение ко всему, и оно будет скомпилировано. Однако вы передаете делегат типа MethodInvoker
с подписью delegate void MethodInvoker()
. Таким образом, в теле метода, который вы разыгрываете в MethodInvoker, вы не можете return
ничего.
Попробуйте вместо этого второй:
return (int)this.Invoke((Func<int>)delegate
{
return 3;
});
Func<int>
- это делегат, который возвращает int, поэтому он будет компилироваться.