Dikompilasi dengan VS 2012
, dengan jenis proyek WP 8.0
, kode berikut akan gagal jika debugger tidak terpasang.
Entah bagaimana, jika debugger tidak terpasang, pengoptimalan compiler akan merusak kode di dalamnya Crash()
- lihat komentar dalam kode.
Diuji pada Lumia 1520 (8.1) dan Lumia 630 (8.0) .
Adakah ide mengapa ini terjadi?
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
Sepertinya bug kompiler, bukan bug Rx. Sudahkah Anda mencoba menggunakan ILSpy atau .NET Reflector untuk memeriksa IL yang dihasilkan?
—
Brandon
Saya akan mencoba menggunakan
—
cwharris
Observable.Return<T2>(_t2);
, daripada menyerahkannya kepada kompiler untuk memutuskan jenisnya di sini. Mungkin ada bug dengan itu. Memang, itu tembakan yang panjang.
Saya mengalami banyak masalah dengan Rx di Windows Phone. Bagi saya, itu akan mengkompilasi, lalu melempar
—
Matthew Haugen
MethodNotFoundException
ketika saya benar-benar mencoba memanggil kelas yang memuatnya. Bagi saya, meningkatkan ke versi rilis Pembaruan VS 2 berfungsi. Saya masih tidak tahu apa yang sebenarnya salah, tetapi pastikan Anda menggunakan pembaruan terkini dalam segala hal. Jelas masalah kita sedikit berbeda, tapi itu mungkin bisa membantu memberikan petunjuk.
Apa pertanyaannya - 'ada ide?' - apakah Anda hanya ingin tahu bagaimana membuatnya berhenti mogok?
—
Tim Lovell-Smith
mungkin karena _t1.Foo <tipe yang hilang di sini> (dan di sini juga);
—
akbar ali