Reactive Extensions-Fehler unter Windows Phone

114

Kompiliert mit VS 2012, mit Projekttyp schlägt WP 8.0der folgende Code fehl, wenn der Debugger nicht angehängt ist.

Wenn der Debugger nicht angehängt ist, ruinieren Compiler-Optimierungen den Code Crash()- siehe Kommentare im Code.

Getestet mit Lumia 1520 (8.1) und Lumia 630 (8.0) .

Irgendwelche Ideen, warum dies geschieht?

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());
    }
}
Yuriy Naydenov
quelle
6
Scheint ein Compiler-Fehler zu sein, kein Rx-Fehler. Haben Sie versucht, ILSpy oder .NET Reflector zu verwenden, um die generierte IL zu untersuchen?
Brandon
8
Ich würde versuchen, es zu verwenden Observable.Return<T2>(_t2);, anstatt es dem Compiler zu überlassen, den Typ hier zu bestimmen. Daran könnte ein Fehler liegen. Zugegeben, das ist ein langer Schuss.
Cwharris
6
Ich hatte eine Menge Probleme mit Rx unter Windows Phone. Für mich würde es kompilieren und dann ein werfen, MethodNotFoundExceptionwenn ich tatsächlich versuchte, die enthaltende Klasse aufzurufen. Für mich hat das Upgrade auf die Release-Version von VS Update 2 funktioniert. Ich habe immer noch keine Ahnung, was eigentlich falsch war, aber stellen Sie sicher, dass Sie die neuesten Updates für alles verwenden. Natürlich sind unsere Probleme etwas anders, aber das könnte helfen, eine Anleitung zu geben.
Matthew Haugen
5
Was ist die Frage - "irgendwelche Ideen?" - Wollen Sie nur wissen, wie Sie verhindern können, dass es abstürzt?
Tim Lovell-Smith
1
kann daran liegen, dass _t1.Foo <fehlender Typ hier> (und auch hier);
Akbar Ali

Antworten:

1
 _t1.Foo<type>(type);

Ihnen fehlt die Typdeklaration. Der Compiler rät (und rät falsch). Geben Sie alles genau ein und es sollte laufen.

Japes
quelle
Dies ist kein Hinweis, Sie können IObserver und IObservable selbst implementieren und alles wird gut funktionieren.
Yuriy Naydenov
Es sieht so aus, als würde der Debugger eine Verbindung zum Compiler herstellen, und auch der Debugger benötigt alle Variablen, die streng typisiert werden müssen. Der Debugger rät richtig und der Compiler nimmt irgendwie Fragen davon. Es spielt keine Rolle, warum der Debugger das Problem behebt, die Grundursache wurde gefunden.
Japes