Помилка реактивних розширень на 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.