Error de extensiones reactivas en Windows Phone


114

Compilado con VS 2012, con tipo de proyectoWP 8.0 el siguiente código fallará si no se adjunta el depurador.

De alguna manera, si el depurador no está adjunto, las optimizaciones del compilador arruinan el código interno Crash(); consulte los comentarios en el código.

Probado en Lumia 1520 (8.1) y Lumia 630 (8.0) .

¿Alguna idea de por qué está ocurriendo esto?

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
Parece un error del compilador, no un error de Rx. ¿Ha intentado utilizar ILSpy o .NET Reflector para examinar el IL generado?
Brandon

8
Intentaría usar Observable.Return<T2>(_t2); , en lugar de dejar que el compilador decida el tipo aquí. Podría haber un error con eso. Por supuesto, eso es una posibilidad remota.
cwharris

6
He tenido muchos problemas con Rx en Windows Phone. Para mí, se compilaría, luego arrojaría un MethodNotFoundExceptioncuando realmente intenté llamar a la clase contenedora. Para mí, la actualización a la versión de lanzamiento de VS Update 2 funcionó. Todavía no tengo idea de lo que estaba realmente mal, pero asegúrese de que está usando las últimas actualizaciones en todo. Obviamente, nuestros problemas son un poco diferentes, pero eso podría ayudar a orientarnos.
Matthew Haugen

5
¿Cuál es la pregunta? ¿Alguna idea? - ¿Solo quieres saber cómo hacer que deje de estrellarse?
Tim Lovell-Smith

1
puede deberse a que _t1.Foo <texto faltante aquí> (y aquí también);
akbar ali

Respuestas:


1
 _t1.Foo<type>(type);

Falta la declaración de tipo. El compilador está adivinando (y adivinando mal). Escriba todo estrictamente y debería ejecutarse.


Esto no es una pista, puede implementar IObserver e IObservable usted mismo y todo funcionará bien.
Yuriy Naydenov

Parece que el depurador está creando una conexión con el compilador, y el depurador también necesita que todas las vars estén escritas estrictamente. El depurador está adivinando correctamente y el compilador de alguna manera está tomando preguntas. Realmente no importa por qué el depurador soluciona el problema, se ha encontrado la causa raíz.
Japes
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.