Помилка реактивних розширень на Windows Phone


114

Скомпільований з VS 2012типом проекту WP 8.0наступний код не вдасться, якщо налагоджувач не додається.

Якось, якщо налагоджувач не приєднаний, оптимізація компілятора руйнує код всередині Crash()- див. Коментарі в коді.

Тестували на Lumia 1520 (8.1) та Lumia 630 (8.0) .

Будь-які ідеї, чому це відбувається?

public partial class MainPage : PhoneApplicationPage
{
    public MainPage()
    {
        InitializeComponent();
        Button.Tap += (sender, args) => new A<B, string>(new B(), "string").Crash();
    }
}
public class B
{
    public void Foo<T>(T val) { }
}
public class A<T1, T2> where T1 : B
{
    private T1 _t1;
    private T2 _t2;
    public A(T1 t1, T2 t2)
    {
        _t2 = t2;
        _t1 = t1;
    }
    public void Crash()
    {
        var obs = Observable.Return(_t2);
        obs.Subscribe(result =>
        {
            //CLR is expecting T2 to be System.String here,
            //but somehow, after passing through Observable
            //T2 here is not a string, it's A<T1, T2>

            new List<T2>().Add(result);
        });
        //Will run normally if commented
        _t1.Foo(new object());
    }
}

6
Схоже, помилка компілятора, а не помилка Rx. Ви спробували використовувати ILSpy або .NET Reflector для дослідження сформованого ІЛ?
Брендон

8
Я б спробував використати Observable.Return<T2>(_t2);, а не залишати це компілятору для вирішення типу. З цим може виникнути помилка. Зрозуміло, це далеко не постріл.
cwharris

6
У мене було багато проблем з Rx на Windows Phone. Для мене він би склав, а потім кинув a, MethodNotFoundExceptionколи я насправді намагався викликати клас, що містить. Для мене працювало оновлення до версії випуску VS Update 2. Я досі не маю уявлення, що насправді було не так, але переконайтесь, що ви використовуєте останні оновлення щодо всього. Очевидно, наші проблеми дещо інші, але це може допомогти надати певні вказівки.
Меттью Хоген

5
Яке питання - "якісь ідеї?" - ти просто хочеш знати, як домогтися, щоб перестати збиватися?
Тім Ловелл-Сміт

1
може бути тому, що _t1.Foo <тут відсутній тип> (і тут також);
akbar ali

Відповіді:


1
 _t1.Foo<type>(type);

Вам не вистачає декларації типу. Компілятор здогадується (і гадає неправильно). Суворо введіть усе, і воно повинно працювати.


Це не поняття, ви можете реалізувати IObserver та IObservable власноруч, і все буде добре.
Юрій Найденов

Схоже, налагоджувач створює з'єднання з компілятором, а також налагоджувачу потрібні всі строки набору. Налагоджувач відгадує правильно, а компілятор якось переймає питання. Не важливо, чому налагоджувач вирішує проблему, першопричину знайдено.
Japes
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.