Ошибка Не удается преобразовать лямбда-выражение при подписке на IObservable‹Point›

я пытаюсь реализовать стандартное перетаскивание изображения в wpf, используя Rx.

var mouseDown = from evt in Observable.FromEventPattern<MouseButtonEventArgs>(image, "MouseLeftButtonDown")
                          select evt.EventArgs.GetPosition(image);

            var mouseUp = Observable.FromEventPattern<MouseButtonEventArgs>(this, "MouseLeftButtonUp");

            var mouseMove = from evt in Observable.FromEventPattern<MouseEventArgs>(this, "MouseMove")
                            select evt.EventArgs.GetPosition(this);

            var q = from startLocation in mouseDown
                    from endLocation in mouseMove.TakeUntil(mouseUp)
                    select new Point 
                    {
                        X = endLocation.X - startLocation.X,
                        Y = endLocation.Y - startLocation.Y
                    };

            q.ObserveOn(SynchronizationContext.Current).Subscribe(point =>
            {
                Canvas.SetLeft(image, point.X);
                Canvas.SetTop(image, point.Y);
            });

я получаю сообщение об ошибке Ошибка Cannot convert lambda expression to type 'System.IObserver<System.Windows.Point>' because it is not a delegate type

что мне не хватает?


person ashutosh raina    schedule 26.02.2012    source источник
comment
Ваш код работает нормально для меня. Вы ссылались на Rx-Main и Rx-WPF?   -  person Phil    schedule 26.02.2012
comment
Пожалуйста, проверьте, указан ли на вашей целевой платформе клиентский профиль .NET 4, и если да, измените его на .NET 4.   -  person Christoph    schedule 27.02.2012
comment
я изменил целевую платформу ... она все еще не собирается   -  person ashutosh raina    schedule 27.02.2012
comment
у вас System импортировано? Используемый вами Subscribe является методом расширения, определенным классом в этом пространстве имен.   -  person Gideon Engelberth    schedule 27.02.2012
comment
не могли бы вы опубликовать это как ответ с некоторыми подробностями, чтобы я мог его принять...   -  person ashutosh raina    schedule 27.02.2012


Ответы (3)


Пространство имен System.Reactive.Linq содержит статический класс Observable, который определяет все методы расширения для обычных реактивных комбинаторов. Он находится в System.Reactive.dll

Однако методы расширения для IObservable<T>.Subscribe, такие как Subscribe(onNext), Subscribe(onNext, onError), определены в mscorlib в статическом классе System.ObservableExtensions.

tl;dr:

  • Для методов расширения Rx/Observable вам необходимо импортировать System.Reactive.Linq = using System.Reactive.Linq;
  • Для перегрузок подписки вам необходимо импортировать System = using System;
person Asti    schedule 06.03.2012

Чтобы сделать это более четким ответом, основанным на комментарии @Gideon Engelberths, пятом внизу в вопросе, я пропустил «использование системы»; используя директиву в моем классе:

using System.Reactive.Linq;
using System;

Что затем исправило проблему с компилятором. Спасибо, Гидеон.

person The Senator    schedule 07.04.2017

Я только что наткнулся на этот вопрос и хотел добавить, что мне нужно было добавить больше ссылок в проект.
Одной ссылки на System.Reactive.Linq в моем случае было недостаточно.

После добавления этих трех проблема с компилятором была решена:

  • System.Reactive.Core
  • System.Reactive.Interfaces
  • System.Reactive.Linq

Благодаря комментарию @Gideon Engelberths и ответу сенатора.

person Luqqu    schedule 30.01.2019