Первая версия эффективно делает:
Action tmp = () => _myMessage = "hello";
var action = new Action(tmp);
Проблема, с которой вы сталкиваетесь, заключается в том, что компилятор должен знать, в какой тип делегата (или дерева выражений) должно быть преобразовано лямбда-выражение. Вот почему это:
var action = () => _myMessage="hello";
фактически не компилируется - это может быть любой тип делегата без параметров и либо без возвращаемого значения, либо с тем же типом возврата, что и _myMessage
(предположительно string
) Например, все они действительны:
Action action = () => _myMessage="hello";
Func<string> action = () => _myMessage="hello";
MethodInvoker action = () => _myMessage="hello";
Expression<Action> = () => _myMessage="hello";
// etc
Как мог компилятор C # определить, каким должен быть тип action
, если он был объявлен с помощью var
?
Самый простой способ обойти это при вызове метода (для вашего примера Rhino Mocks) - разыграть:
methodOptions.Do((Action) (() => _myMessage = "hello"));