ข้อผิดพลาด Reactive Extensions บน Windows Phone


114

คอมไพล์ด้วยVS 2012ประเภทโปรเจ็กต์WP 8.0รหัสต่อไปนี้จะล้มเหลวหากไม่ได้แนบดีบักเกอร์

อย่างไรก็ตามหากไม่ได้แนบดีบักเกอร์การเพิ่มประสิทธิภาพคอมไพเลอร์จะทำลายโค้ดภายในCrash()- ดูความคิดเห็นในโค้ด

การทดสอบบนLumia 1520 (8.1)และLumia 630 (8.0)

มีความคิดว่าเหตุใดจึงเกิดขึ้น

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
ดูเหมือนว่าเป็นบั๊กคอมไพเลอร์ไม่ใช่บั๊ก Rx คุณได้ลองใช้ ILSpy หรือ. NET Reflector เพื่อตรวจสอบ IL ที่สร้างขึ้นแล้วหรือยัง?
Brandon

8
ฉันจะลองใช้Observable.Return<T2>(_t2);แทนที่จะปล่อยให้คอมไพเลอร์ตัดสินใจประเภทที่นี่ อาจมีข้อผิดพลาดเกิดขึ้น จริงอยู่ที่ยิงไกล
cwharris

6
ฉันมีปัญหามากมายกับ Rx บน Windows Phone สำหรับฉันมันจะรวบรวมแล้วโยนMethodNotFoundExceptionตอนที่ฉันพยายามเรียกคลาสที่มีจริงๆ สำหรับฉันแล้วการอัปเกรด VS Update 2 เป็นเวอร์ชันรีลีสใช้งานได้ ฉันยังไม่รู้ว่ามีอะไรผิดปกติ แต่ตรวจสอบให้แน่ใจว่าคุณใช้การอัปเดตล่าสุดกับทุกสิ่ง เห็นได้ชัดว่าปัญหาของเราแตกต่างกันเล็กน้อย แต่อาจช่วยให้คำแนะนำได้บ้าง
Matthew Haugen

5
คำถามคืออะไร? - คุณแค่อยากรู้วิธีทำให้มันหยุดขัดข้องหรือไม่?
Tim Lovell-Smith

1
อาจเป็นเพราะ _t1.Foo <ประเภทที่หายไปที่นี่> (และที่นี่ด้วย);
akbar ali

คำตอบ:


1
 _t1.Foo<type>(type);

คุณไม่มีการประกาศประเภท คอมไพเลอร์คาดเดา (และเดาผิด) พิมพ์ทุกอย่างอย่างเคร่งครัดและควรรัน


นี่ไม่ใช่เบาะแสคุณสามารถใช้ IObserver และ IObservable ได้ด้วยตัวเองและทุกอย่างจะทำงานได้ดี
Yuriy Naydenov

ดูเหมือนว่าดีบักเกอร์กำลังสร้างการเชื่อมต่อกับคอมไพเลอร์และดีบักเกอร์ก็ต้องการให้พิมพ์ vars ทั้งหมดอย่างเคร่งครัด ดีบักเกอร์คาดเดาถูกต้องและคอมไพเลอร์ก็รับคำถามจากมัน มันไม่สำคัญจริงๆว่าทำไมดีบั๊กจึงแก้ไขปัญหาได้พบสาเหตุที่แท้จริง
Japes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.