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
Intentaría usar
—
cwharris
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.
He tenido muchos problemas con Rx en Windows Phone. Para mí, se compilaría, luego arrojaría un
—
Matthew Haugen
MethodNotFoundException
cuando 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.
¿Cuál es la pregunta? ¿Alguna idea? - ¿Solo quieres saber cómo hacer que deje de estrellarse?
—
Tim Lovell-Smith
puede deberse a que _t1.Foo <texto faltante aquí> (y aquí también);
—
akbar ali