InvalidOperationException: возвращаемое значение делегата должно быть назначено из

Я получаю исключение по методу Do Rhino Mock.

System.InvalidOperationException: возвращаемое значение делегата должно назначаться из MediaPlayerImpl.ScreenControl.ScreenCommunicatorState

Мне не очень понятно, как это решить. Ниже мой код. Его довольно просто понять.

var mockCommunicator = Rhino.Mocks.MockRepository.GenerateStrictMock<IScreenCommunicator>();

ManualResetEvent screenTurnedOff = new ManualResetEvent(false);

mockCommunicator.Expect(c => c.TurnScreenOff(default(ScreenCommunicatorState))).IgnoreArguments()
                                .Do(new Action(() => screenTurnedOff.Set()));


  public override ScreenCommunicatorState TurnScreenOn(ScreenCommunicatorState state)
    {
        state = state ?? new ScreenCommunicatorState { isScreenOn = false };

        if (state.isScreenOn)
        {
            // Try and Get the screen power state

            // ....
            Task<byte[]> requestTask = SendRequest(CommandSequences.GetPowerStatus);
            var isPowerOn = InterpretScreenPowerStatusMessage(requestTask);
            if (isPowerOn.Value)
            {
                //        Do nothing
            }
            else if (!isPowerOn.Value)
            {
                SendCommandSequence(CommandSequences.PowerOn);
            }
            else if (isPowerOn == null)
            {
                SendCommandSequence(CommandSequences.PowerOn);
            }




            // NO


        }

        state.isScreenOn = true;

        Task<bool?> screenTurnedOnTask = IsScreenTurnedOn();

        Func<Task<bool?>, Task> doSomeWork = TurnScreenOnAndRectifyScreenInputSource;



        Task<Task> turnScreenOnIfNecessaryTask = screenTurnedOnTask.ContinueWith(doSomeWork, TaskContinuationOptions.NotOnFaulted);

        Task unwrapped = turnScreenOnIfNecessaryTask.Unwrap();
        try
        {
            unwrapped.Wait(); // This will thrown an exception if it's faulted, which is what we want
        }
        catch (AggregateException aggregateException)
        {
            if (aggregateException.InnerExceptions.Count() == 1)
            {
                throw aggregateException.InnerExceptions[0];
            }
            else
            {
                throw;
            }
        }
        return state;
    }

1 ответ

Мне пришлось использовать и Func Delegate для того, чтобы решить проблему.

.Do(new Func<ScreenCommunicatorState,ScreenCommunicatorState>((id) => {
                                screenTurnedOff.Set();
                                return new ScreenCommunicatorState();
                            }))
                            .Return(new ScreenCommunicatorState());
Другие вопросы по тегам