Bogue des extensions réactives sur Windows Phone

114

Compilé avec VS 2012, avec le type de projet, WP 8.0le code suivant échouera si le débogueur n'est pas attaché.

D'une manière ou d'une autre, si le débogueur n'est pas attaché, les optimisations du compilateur ruinent le code à l'intérieur Crash()- voir les commentaires dans le code.

Testé sur Lumia 1520 (8,1) et Lumia 630 (8,0) .

Des idées pourquoi cela se produit?

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
la source
6
Cela ressemble à un bogue du compilateur, pas à un bogue Rx. Avez-vous essayé d'utiliser ILSpy ou .NET Reflector pour examiner l'IL généré?
Brandon
8
J'essaierais d'utiliser Observable.Return<T2>(_t2);, plutôt que de laisser au compilateur le soin de décider du type ici. Il pourrait y avoir un bug avec ça. Certes, c'est loin.
cwharris
6
J'ai eu une tonne de problèmes avec Rx sur Windows Phone. Pour moi, il compilerait, puis lancerait un MethodNotFoundExceptionlorsque j'essayais d'appeler la classe contenant. Pour moi, la mise à niveau vers la version finale de VS Update 2 a fonctionné. Je n'ai toujours aucune idée de ce qui n'allait pas, mais assurez-vous que vous utilisez les dernières mises à jour sur tout. Évidemment, nos problèmes sont un peu différents, mais cela pourrait aider à donner des indications.
Matthew Haugen
5
Quelle est la question - "des idées?" - voulez-vous juste savoir comment l'arrêter de planter?
Tim Lovell-Smith
1
peut-être parce que _t1.Foo <type manquant ici> (et ici aussi);
akbar ali le

Réponses:

1
 _t1.Foo<type>(type);

Il vous manque la déclaration de type. Le compilateur est en train de deviner (et de deviner mal). Tapez strictement tout et il devrait fonctionner.

Japes
la source
Ce n'est pas un indice, vous pouvez implémenter IObserver et IObservable par vous-même et tout fonctionnera très bien.
Yuriy Naydenov
Il semble que le débogueur crée une connexion au compilateur, et le débogueur a également besoin que toutes les variables soient strictement typées. Le débogueur suppose que c'est correct, et le compilateur en prend en quelque sorte des questions. La raison pour laquelle le débogueur résout le problème n'a pas vraiment d'importance, la cause principale a été trouvée.
Japes