Windows Phone'da Reaktif Uzantılar hatası


114

VS 2012Proje türü ile derlendiğinde , WP 8.0hata ayıklayıcı eklenmemişse aşağıdaki kod başarısız olacaktır.

Bir şekilde, hata ayıklayıcı eklenmemişse, derleyici optimizasyonları içindeki kodu mahveder Crash()- koddaki yorumlara bakın.

Lumia 1520 (8.1) ve Lumia 630 (8.0) üzerinde test edilmiştir .

Bunun neden meydana geldiğine dair bir fikriniz var mı?

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
Bir derleyici hatası gibi görünüyor, bir Rx hatası değil. Oluşturulan IL'yi incelemek için ILSpy veya .NET Reflector'ı kullanmayı denediniz mi?
Brandon

8
Observable.Return<T2>(_t2);Buradaki türe karar vermek için onu derleyiciye bırakmaktansa kullanmayı denerdim . Bununla ilgili bir hata olabilir. Kabul edildi, bu uzun bir atış.
cwharris

6
Windows Phone'da Rx ile bir ton sorun yaşadım. Benim için derlenir, ardından MethodNotFoundExceptioniçeren sınıfı aramaya çalıştığımda bir atar . Benim için VS Update 2'nin yayın sürümüne yükseltme yapmak işe yaradı. Hala neyin yanlış olduğu hakkında hiçbir fikrim yok, ancak her şeyde en son güncellemeleri kullandığınızdan emin olun. Açıkçası sorunlarımız biraz farklı, ancak bu biraz yol gösterici olabilir.
Matthew Haugen

5
Soru nedir - 'herhangi bir fikir mi?' - sadece çökmesini nasıl durduracağınızı öğrenmek mi istiyorsunuz?
Tim Lovell-Smith

1
_t1.Foo <burada eksik tür> (ve burada da);
akbar ali

Yanıtlar:


1
 _t1.Foo<type>(type);

Tür bildirimini kaçırıyorsunuz. Derleyici tahmin ediyor (ve yanlış tahmin ediyor). Kesinlikle her şeyi yazın ve çalışmalıdır.


Bu bir ipucu değil, IObserver ve IObservable'ı kendi başınıza uygulayabilirsiniz ve her şey yolunda gidecek.
Yuriy Naydenov

Görünüşe göre hata ayıklayıcı derleyiciye bir bağlantı oluşturuyor ve hata ayıklayıcının da tüm değişkenlerin kesinlikle yazılması gerekiyor. Hata ayıklayıcı doğru tahmin ediyor ve derleyici bir şekilde ondan sorgu alıyor. Hata ayıklayıcının sorunu neden düzelttiği gerçekten önemli değil, temel neden bulundu.
Japes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.