คอมไพล์ด้วย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
ฉันจะลองใช้
—
cwharris
Observable.Return<T2>(_t2);
แทนที่จะปล่อยให้คอมไพเลอร์ตัดสินใจประเภทที่นี่ อาจมีข้อผิดพลาดเกิดขึ้น จริงอยู่ที่ยิงไกล
ฉันมีปัญหามากมายกับ Rx บน Windows Phone สำหรับฉันมันจะรวบรวมแล้วโยน
—
Matthew Haugen
MethodNotFoundException
ตอนที่ฉันพยายามเรียกคลาสที่มีจริงๆ สำหรับฉันแล้วการอัปเกรด VS Update 2 เป็นเวอร์ชันรีลีสใช้งานได้ ฉันยังไม่รู้ว่ามีอะไรผิดปกติ แต่ตรวจสอบให้แน่ใจว่าคุณใช้การอัปเดตล่าสุดกับทุกสิ่ง เห็นได้ชัดว่าปัญหาของเราแตกต่างกันเล็กน้อย แต่อาจช่วยให้คำแนะนำได้บ้าง
คำถามคืออะไร? - คุณแค่อยากรู้วิธีทำให้มันหยุดขัดข้องหรือไม่?
—
Tim Lovell-Smith
อาจเป็นเพราะ _t1.Foo <ประเภทที่หายไปที่นี่> (และที่นี่ด้วย);
—
akbar ali