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

Вопрос

Ошибка неоднозначной ссылки IObservable

Автор вопроса: Mukesh RawatОтветов: 2

Я использую реактивные расширения в своем приложении WPF. И при его использовании я получаю ниже неоднозначную ошибку ссылки.

The type 'System.IObservable<T>' exists in both 'mscorlib.dll' and 'System.Reactive.dll'

Я также пробовал с полным именем и пробовал этот URL тоже, но не повезло. Я использую версию Reactive Extensions для .NET 4.0.

Мой код:

using System; // mscorlib.dll
using Rx = System.Reactive;

public Rx.IObservable<int> BytesReceived { get { return _bytesReceivedSubj; } } // Not valid as IObservable is in System namespace of System.Reactive.

public IObservable<int> BytesReceived { get { return _bytesReceivedSubj; } } // With this I'm getting ambiguous reference error

введите здесь описание изображения

Есть идеи, как я могу это решить?

Спасибо

  • Ошибка довольно понятна. У вас есть 2 библиотеки, обе из которых имеют определение IObservable, поэтому вам нужно уточнить, какую из них вы пытаетесь использовать. Kevin DiTraglia 29.07.2013
  • Оба находятся в пространстве имен System, и в той же форме я использую System из mscorlib также для обработчиков событий и всего остального. Итак, как я могу дать здесь полное имя для IObservable? Если бы я использовал System.IObservable, это снова дало бы мне неоднозначную ошибку ссылки. Mukesh Rawat 29.07.2013
  • У вас нет где-нибудь лишнего using System.Reactive;, не так ли? Kevin DiTraglia 29.07.2013
  • @Kevin, нет, у меня нет дополнительного объявления System.Reactive в моей форме. Mukesh Rawat 29.07.2013

wpfmscorlib

Ответы

Ответ 1 · рейтинг 5 · Sheridan

Когда вы ссылаетесь на IObservable, используйте либо

System.Reactive.IObservable<T>

or

System.IObservable<T>

ОБНОВЛЕНИЕ>>>

Аааа, теперь, когда вы добавили изображение, я вижу вашу проблему. У вас есть два класса System.IObservable... какие идиоты эти реактивные ребята!

В любом случае, взгляните на эти сообщения:

Как получить доступ к введите одно и то же полное имя в двух разных DLL

Пошаговое руководство по внешнему псевдониму

Это некрасиво, но должно вам помочь.

Ответ 2 · рейтинг 8 · Jim Wooley

Когда вы говорите, что используете версию Rx для .Net 4, какую версию Rx вы используете? 1.1 или 2.х? При использовании 2.x у вас не должно быть ссылки на System.Reactive, а скорее на System.Reactive.Core. Я подозреваю, что вы обновили этот проект с .Net 3.5, но не обновили все необходимые ссылки. Убедитесь, что используемая вами версия Rx не предназначена для Silverlight 4 или .Net 3.5 (в ядре которой не было IObservable/IObserver).

Это может быть проще всего, если вы просто удалите ссылки на реактивные и nuget повторно добавят их для вас, используя версию Reactive Extensions - WPF Helpers. Примечание. Возможно, вам придется изменить импорт для классов, использующих Rx, для импорта System.Reactive.Linq, если вы используете более старую версию, в которой методы расширения были в старом пространстве имен System.Linq.

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

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