Bug delle estensioni reattive su Windows Phone


114

Compilato con VS 2012, con il tipo di progetto, WP 8.0il codice seguente avrà esito negativo se il debugger non è collegato.

In qualche modo, se il debugger non è collegato, le ottimizzazioni del compilatore rovinano il codice all'interno Crash(): vedere i commenti nel codice.

Testato su Lumia 1520 (8.1) e Lumia 630 (8.0) .

Qualche idea sul perché sta accadendo?

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
Sembra un bug del compilatore, non un bug Rx. Hai provato a utilizzare ILSpy o .NET Reflector per esaminare l'IL generato?
Brandon

8
Proverei a usare Observable.Return<T2>(_t2);, piuttosto che lasciare che sia il compilatore a decidere il tipo qui. Potrebbe esserci un bug con quello. Certo, è un tiro lungo.
cwharris

6
Ho avuto un sacco di problemi con Rx su Windows Phone. Per me, si compila, quindi genera un MethodNotFoundExceptionquando ho effettivamente provato a chiamare la classe contenente. Per me, l'aggiornamento alla versione di rilascio di VS Update 2 ha funzionato. Non ho ancora idea di cosa fosse effettivamente sbagliato, ma assicurati di utilizzare gli ultimi aggiornamenti su tutto. Ovviamente i nostri problemi sono un po 'diversi, ma questo potrebbe aiutare a fornire una guida.
Matthew Haugen

5
Qual è la domanda: "qualche idea?" - vuoi solo sapere come smettere di bloccarsi?
Tim Lovell-Smith

1
potrebbe essere perché _t1.Foo <tipo mancante qui> (e anche qui);
akbar ali

Risposte:


1
 _t1.Foo<type>(type);

Ti manca la dichiarazione del tipo. Il compilatore indovina (e indovina sbagliato). Scrivi tutto rigorosamente e dovrebbe funzionare.


Questo non è un indizio, puoi implementare IObserver e IObservable da solo e tutto funzionerà perfettamente.
Yuriy Naydenov

Sembra che il debugger stia creando una connessione al compilatore, e anche il debugger ha bisogno che tutte le variabili siano strettamente digitate. Il debugger sta supponendo corretto e il compilatore in qualche modo sta prendendo domande da esso. Non importa davvero perché il debugger risolve il problema, la causa principale è stata trovata.
Japes
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.