Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: ashutosh rainaОтветов: 3

я пытаюсь реализовать стандартное перетаскивание изображения в 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

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

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

lambdawpf

Ответы

Ответ 1 · рейтинг 54 · Asti

Пространство имен 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;

Ответ 2 · рейтинг 17 · The Senator

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

using System.Reactive.Linq;
using System;

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

Ответ 3 · рейтинг 1 · Luqqu

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

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы