Kompiliert mit VS 2012
, mit Projekttyp schlägt WP 8.0
der folgende Code fehl, wenn der Debugger nicht angehängt ist.
Wenn der Debugger nicht angehängt ist, ruinieren Compiler-Optimierungen den Code Crash()
- siehe Kommentare im Code.
Getestet mit Lumia 1520 (8.1) und Lumia 630 (8.0) .
Irgendwelche Ideen, warum dies geschieht?
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
quelle
quelle
Observable.Return<T2>(_t2);
, anstatt es dem Compiler zu überlassen, den Typ hier zu bestimmen. Daran könnte ein Fehler liegen. Zugegeben, das ist ein langer Schuss.MethodNotFoundException
wenn ich tatsächlich versuchte, die enthaltende Klasse aufzurufen. Für mich hat das Upgrade auf die Release-Version von VS Update 2 funktioniert. Ich habe immer noch keine Ahnung, was eigentlich falsch war, aber stellen Sie sicher, dass Sie die neuesten Updates für alles verwenden. Natürlich sind unsere Probleme etwas anders, aber das könnte helfen, eine Anleitung zu geben.Antworten:
Ihnen fehlt die Typdeklaration. Der Compiler rät (und rät falsch). Geben Sie alles genau ein und es sollte laufen.
quelle