Compilé avec VS 2012
, avec le type de projet, WP 8.0
le 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());
}
}
c#
.net
compiler-errors
windows-phone
system.reactive
Yuriy Naydenov
la source
la source
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.MethodNotFoundException
lorsque 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.Réponses:
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.
la source