Подтвердить что ты не робот

С#.NET Rx- Где System.Reactive?

У меня интенсивный фон Java, поэтому простите меня, если я пропущу что-то очевидное на С#, но мое исследование никуда не денется. Я пытаюсь использовать реактивную библиотеку Rx.NET. Компилятор не жалуется на IObservable, но с вызовом метода zip. Это бросает "... вам не хватает ссылки на директиву или сборку?"

Я проходил через пространства имен, и я не могу найти то, что ищет. Я не могу найти System.Reactive, который также выдает ошибку, если используется, и все ссылки уже включены для этого приложения Windows 8.1. Может кто-то, пожалуйста, дайте мне понять, что не так?

public sealed class EventEngine
{    
    private static readonly EventEngine singleton = new EventEngine();

    public static EventEngine get()
    {
        return singleton;
    }

    public IObservable<MusicNote> CurrentKey { get; set; }
    public IObservable<Scale> CurrentScale { get; set; }

    public IObservable<AppliedScale> CurrentAppliedScale
    {
        get
        {
            return CurrentScale.zip(CurrentKey,
                (s, k) => AppliedScale.getAppliedScale(k, s));
        } 
    }

    private EventEngine() {}
}

* ОБНОВЛЕНИЕ *

Вот рабочая версия после рассмотрения ответов.

public sealed class EventEngine
{
    private static readonly EventEngine singleton = new EventEngine();

    public static EventEngine get()
    {
        return singleton;
    }

    public IObservable<MusicNote> CurrentKey { get; set; }
    public IObservable<Scale> CurrentScale { get; set; }

    public IObservable<AppliedScale> CurrentAppliedScale
    {
        get
        {
            return Observable.Zip(CurrentScale, CurrentKey,
                (s, k) => AppliedScale.getAppliedScale(s,k));
        } 
    }

    private EventEngine() {}
}
4b9b3361

Ответ 1

Вероятно, вы не добавили необходимые ссылки на сборки для Rx в свой проект. (Ссылка на сборку - это не то же самое, что импортировать пространство имен! Вы уже знаете, что такое пространство имен: сборка похожа на JAR, наименьшую единицу развертывания/распространения кода. Ваш проект должен ссылаться на него до пространств имен, определенных внутри он станет доступен для использования.)

Компилятор, вероятно, не жалуется на IObservable<T> и IObserver<T>, потому что ваш проект нацелен на .NET Framework версии 4 или новее. Эти два интерфейса были частью основной библиотеки классов .NET Framework Class Library (FCL) с .NET версии 4. (Если вы нацелились на более раннюю версию .NET, вы получите ошибки для использования этих undefined).

Каждая часть Rx, кроме этих двух интерфейсов, не входит в основной .NET FCL, а располагается в своих собственных (дополнительных) сборках. Вы можете добавить их в свой проект, например. установив соответствующий пакеты NuGet:

  • В Visual Studio перейдите в Tools → Менеджер пакетов NuGet → Консоль диспетчера пакетов.

  • В окне консоли NuGet выберите целевой проект (где вы хотите использовать Rx) в раскрывающемся списке проекта по умолчанию.

  • Затем введите Install-Package System.Reactive и нажмите Enter ↵. (Примечание: этот пакет раньше назывался Rx-Main, подробнее см. этот ответ.)

  • Это добавит ссылки на сборку System.Reactive.* для вашего проекта.

Ответ 2

Начиная с версии 3 проект Rx теперь известен как System.Reactive, потому что он "приводит к присвоению имен NuGet в соответствии с принципами NuGet, а также доминирующим пространством имен в каждом пакете".

Его можно загрузить из NuGet, выполнив поиск "System.Reactive" или вы можете скачать его здесь: https://www.nuget.org/packages/System.Reactive/

Вот проект страницы GitHub: https://github.com/Reactive-Extensions/Rx.NET

Сопоставление пакетов

  • Rx-Main System.Reactive
  • Rx-Core System.Reactive.Core
  • Rx-Interfaces System.Reactive.Interfaces
  • Rx-Linq System.Reactive.Linq
  • Rx-PlatformServices System.Reactive.PlatformServices
  • Rx-Testing Microsoft.Reactive.Testing

Источник