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());
}
}
c#
.net
compiler-errors
windows-phone
system.reactive
Yuriy Naydenov
fuente
fuente
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.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.Respuestas:
Falta la declaración de tipo. El compilador está adivinando (y adivinando mal). Escriba todo estrictamente y debería ejecutarse.
fuente