С#.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() {}
}
Ответы
Ответ 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
Источник