Bug Ekstensi Reaktif di Windows Phone

114

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());
    }
}
Yuriy Naydenov
sumber
6
Sepertinya bug kompiler, bukan bug Rx. Sudahkah Anda mencoba menggunakan ILSpy atau .NET Reflector untuk memeriksa IL yang dihasilkan?
Brandon
8
Saya akan mencoba menggunakan Observable.Return<T2>(_t2);, daripada menyerahkannya kepada kompiler untuk memutuskan jenisnya di sini. Mungkin ada bug dengan itu. Memang, itu tembakan yang panjang.
cwharris
6
Saya mengalami banyak masalah dengan Rx di Windows Phone. Bagi saya, itu akan mengkompilasi, lalu melempar MethodNotFoundExceptionketika 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.
Matthew Haugen
5
Apa pertanyaannya - 'ada ide?' - apakah Anda hanya ingin tahu bagaimana membuatnya berhenti mogok?
Tim Lovell-Smith
1
mungkin karena _t1.Foo <tipe yang hilang di sini> (dan di sini juga);
akbar ali

Jawaban:

1
 _t1.Foo<type>(type);

Anda kehilangan deklarasi type. Kompiler menebak (dan menebak salah). Ketik semuanya dengan ketat dan itu harus berjalan.

Japes
sumber
Ini bukan petunjuk, Anda dapat mengimplementasikan IObserver dan IObservable sendiri dan semuanya akan bekerja dengan baik.
Yuriy Naydenov
Sepertinya debugger membuat koneksi ke kompiler, dan debugger juga membutuhkan semua vars untuk diketik dengan ketat. Debugger menebak dengan benar, dan kompilator entah bagaimana menerima pertanyaan darinya. Tidak masalah mengapa debugger memperbaiki masalah, akar penyebabnya telah ditemukan.
Japes